2011-04-11 3 views
1

HTTP를 사용하여 LAN에서 정상적으로 작동하는 웹 응용 프로그램에서 작동하지만 SSL을 통해 원격으로 테스트 할 때 IE (7 & 8)에서 실패합니다. Firefox, Camino 및 Safari는 모두 완벽하게 작동합니다.SSL을 통한 IE에서 JavaScript 키가 정의되지 않았습니다.

key에 대한 정의가 정의되지 않은 문제를 추적했습니다. key SSL을 통해 IE에 대한 정의되지 않은 것입니다 이유에

function showResult(e,str,num) { 
    var key = (window.Event) ? e.which : e.keyCode; 

    if(((key > 32 && key < 58) || (key > 64 && key < 91) || (key > 95 && key < 123)) && (str.length >= num)) { 

모든 단서하지만 HTTP를 통해 잘 작동 : 코드의 해당 비트는? 더 나은 아직 누군가가이 문제를 극복하는 방법을 말해 줄 수 있습니까? FWIW, 내가 이전 버전의 IE를 지원 할 필요가 없습니다 (7)

업데이트 :

var key; 
e = e || window.event; 
key = e.keyCode || e.which; 

var key = (window.event) ? e.which : e.keyCode; 

를 교체 제안에 대한 답변이 있었다

그 공장. 문제는 그것이 삭제 되었기 때문에 그 대답을 받아 들일 수 없다는 것입니다.

+0

'console.log (window.Event)'에는 무엇이 들어 있습니까? – alex

+0

이벤트 객체를이 함수에 전달하는 것이 확실합니까? IE에서'e == window.event'를 단정하십시오. –

답변

1

알았어, 내 대답이 아니더라도 대답을 다시 추가하고 처음부터 내 대답이 아니더라도 받아 들여서 기분이 좋을 수 있도록 정보를 추가하십시오.

var key; 
e = e || window.event; 
key = e.keyCode || e.which; 

||는 무엇입니까 :

따라서, 제안 된 코드는 무엇입니까? 하나는 논리 연산자 또는 연산자이고, 한 쪽이 부울 true로 평가되면 true를 반환합니다.

JS에서 또 다른 용도가 있습니다. 두 개의 인수를주고 첫 번째 인수가 정의되지 않은 경우 두 번째 인수를 반환합니다. 이것은 위의 코드에서 e이 정의되지 않은 경우 window.event이 대신 IE의 전통적인 이벤트 객체라는 것을 의미합니다.

동일 물이 e.keyCode || e.which과 같은 것으로 사용됩니다. 따라서 결국 다양한 브라우저에서 유효한 키 코드를 얻게 될 것입니다. 모두 이상한 나라에서 좋다.

그러나 잠시 기다려주십시오. 원래 코드가 비슷한 기능을 수행하지 않습니까?

var key = (window.Event) ? e.which : e.keyCode; 

어 - 허. 그게 뭐야? 자바 스크립트는 대단히 민감합니다. 따라서 window.Event이 아니며은 위의 코드에서 window.event과 같습니다. window.event은 발생한 이벤트에 대한 정보를 얻으려는 IE의 전통적인 이벤트 객체이며 window.Event (초기 대문자에서 볼 수 있음)은 생성자이거나보다 구체적으로이 경우 an interface입니다.

포인트는 그 코드에서 모질라를 탐지하는 데 사용되었습니다.존재하는 경우 e.which (Mozilla가 키 코드를 저장하는 장소 중 하나)을 선택하고 그렇지 않으면 e.keyCode으로 이동하여 IE가 키 코드를 저장합니다.

그러나 이것은 IE에 window.Event 생성자가 정의되어 있지 않다는 결함있는 가정을 기반으로합니다. 적어도 IE8에서 정의한 바 있습니다. 즉, 최신 버전의 IE에서는 보다 e.which이 선택됩니다. e.which은 결코 IE에서 지원되지 않습니다. 그래서 key이 정의되지 않은 이유입니다.

하지만 음, 왜 암호화 된 연결과 암호화되지 않은 연결이 다른가요? 좋은 질문입니다. 개발 환경에 대한 액세스가 없으면 확실하게 알 수는 없지만 IE의 호환 모드가있는 것으로 가정합니다.

IE는 역사적으로 (지난 10 년 동안) 가장 기발하고 비표준적인 브라우저였습니다. 이것은 사람들에게 a) IE의 표준에 따라 무식하게 프로그래밍합니다. b) IE의 동작에 대한 대안을 만듭니다. MS가 방금 IE 표준을 준수한다면 IE의 기발한 행동에 의존하는 많은 페이지를 깨뜨릴 수 있습니다. 마이크로 소프트는 IE8 +에 IE의 구 버전을 에뮬레이트함으로써 페이지가 깨지지 않도록하기 위해이 말을 승인했다.

어떤 이유로 든 테스트 환경에서 페이지가 window.Event 생성자/인터페이스가 정의되지 않은 "IE7"모드로 실행되는 것으로 가정 할 수 있습니다. 이렇게하면 이전 코드를 e.keyCode으로 사용할 수 있습니다. 그런 다음 프로덕션 환경에서 또는 어쩌면 암호화 된 연결로 인해 (MS가 수행하는 작업을 ghawd 만 알면) 새로운 IE 모드로 끝나기 때문에 window.Event이 실제로 정의되고 e.which이 선택됩니다. 이것은 IE를 건방진 원숭이로 만듭니다.

결론 : 새 코드를 사용하십시오.

+0

+1 좋은 답변, 오늘 내 마지막 upvote을 가지고 :) – alex

+0

답변과 설명 주셔서 감사. 일반적으로 C에서 코드를 작성하지만 대/소문자 구분을 처리하는 데 익숙하기 때문에 JavaScript에 익숙하지 않고 복사 및 붙여 넣기 만합니다. 사실'var key = (window.Event)? e.which : e.keyCode; '가 여기에있는 다른 대답에서 복사되었습니다. :) –

0

아마도 http (https가 아닌)를 통해 스크립트를 포함했기 때문에 페이지 자체가 안전하고 포함 된 파일이 안전하지 않으므로로드하지 못할 수 있습니다.

+0

모든 포함은 상대 경로로만 참조됩니다. 또한 임시로 테스트 행을'if (str.length> = num) {'로 바꾸면 모든 것을 얻을 수있었습니다. 물론 더 이상 원하지 않는 키를 필터링하지 않습니다. –