2012-03-21 2 views
27

나는이 부분에서 문제가FF가 window.event가 정의되지 않았다고 말하는 이유는 무엇입니까?</p> <pre><code>var ex = { exampl: function(){ var ref=window.event.target||window.event.srcElement; // here alert(ref.innerHTML); // (example) } } </code></pre> <p>가이 기능은이 방법으로 호출됩니다 (추가 이벤트 리스너를 통해 통화 기능)

document.body.childNodes[0].addEventListener('mouseover',ex.exampl,true); 

만 파이어 폭스 window.event이 정의되지 않은 것을 말한다을 ..

나는 무엇을 해야할지 모르겠다. 웹킷 브라우저와 오페라에서 잘 작동합니다 (MSIE에서는 확인할 수 없으며 걱정하지 않습니다).

왜 발생합니까?

+0

올바른 질문은 다른 브라우저에서 작동하는 이유는 무엇입니까? –

답변

20

전달 된 매개 변수 (이 경우 e)를 사용하여 이벤트를 가져 오십시오. 나는 이것을 테스트했으며 window.evente은 크롬에서 지원됩니다.

var ex = { 
    exampl: function(e){ 

    console.log(window.event); 
    console.log(e); 

    //check if we have "e" or "window.event" and use them as "evt" 
    var evt = e || window.event  

    } 
} 
+0

"addEventListener"를 변경해야합니까? –

+0

아니요, 그대로 유지됩니다. – Joseph

+0

감사합니다. 필자는 FF로 작동하기 때문에 다음과 같이 매우 유용했습니다 :'exampl : function (e) {if (window.event &&! e) e = window.event; var ref = e.target || e.srcElement;} '. –

14

window.event 파이어 폭스에 존재하지 않기 때문에

try checking for both, whichever exists

. 브라우저가 서로 다른 이벤트 모델을 가지고 있기 때문에 브라우저 간의 모든 차이점을 다루지 않아도 jQuery와 같은 라이브러리를 사용하거나 차이점을 처리해야합니다. DOM에 오신 것을 환영합니다.

3

크롬에도 기본적으로 적용되지 않습니다. 모든 이벤트 트리거가 자체 이벤트 객체를 전달하는 대신 IE는 window.event에 속성을 추가하고이를 전달했습니다. 한 번에 하나의 이벤트 만 처리 했으므로이 방법이 효과적이었습니다. 모든 브라우저에는 window.Event가 있어야합니다. window.Event는 이벤트 객체의 실제 생성자입니다. IE8 이하에서 'window.event'가 보이면 빈 탭에서 콘솔을 열고 거기에 로깅하거나 경고하십시오. 기회는 당신이보고있는 페이지에 수동으로 추가하는 것입니다.

당신이 이벤트 핸들러에 대한 crossbrowser 정상화 코드를 보면, 자주 볼 수 있습니다 :

이벤트가 IE의 이전 버전을 처리 정상화 코드의
if(!e){ e = window.event; } 

. 현대의 브라우저에서 e는 윈도우의 속성에 대한 참조가 아닌 인수를 통해 전달되는 자체 객체 여야합니다.

13

window.event은 기능이 아닙니다. 버그입니다. MDN을 인용

:

window.event는 DOM 이벤트 핸들러가 호출되는 동안 만 사용할 수있는 독점적 인 마이크로 소프트 인터넷 익스플로러의 속성입니다. 이 값은 현재 처리중인 Event 객체입니다.

그리고 가장 중요한 : 어떤 사양의

일부가 아닙니다.

window.event 그렇게 어떤 브라우저를 지원하기 위해 기대하지 않는다, 비 표준입니다.

element.addEventListener()의 콜백 함수의 첫 번째 매개 변수는 Event 개체입니다. window.event 대신 사용하십시오.

+1

이것은 올바른 방향으로 나를 지적했습니다! 클릭 이벤트와 보조 인수를 모두 가져와야했습니다. 함수의 첫 번째 인수는 이벤트 여야하며 함수 호출에이 인수를 포함해야한다고 말하면서; onclick = 'myClickEvent (event, mySecondAttr);와 같이 – SteinIP