알았어, 내 대답이 아니더라도 대답을 다시 추가하고 처음부터 내 대답이 아니더라도 받아 들여서 기분이 좋을 수 있도록 정보를 추가하십시오.
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를 건방진 원숭이로 만듭니다.
결론 : 새 코드를 사용하십시오.
'console.log (window.Event)'에는 무엇이 들어 있습니까? – alex
이벤트 객체를이 함수에 전달하는 것이 확실합니까? IE에서'e == window.event'를 단정하십시오. –