2011-03-23 5 views
30

나는 가지고있다 :여러 이벤트 리스너/핸들러를 javascript를 사용하여 동일한 요소에 추가 할 수 있습니까?

if (window.addEventListener) { 
    window.addEventListener('load',videoPlayer,false); 
} 
else if (window.attachEvent) { 
    window.attachEvent('onload',videoPlayer); 
} 

그리고 나중에 :

if (window.addEventListener) { 
    window.addEventListener('load',somethingelse,false); 
} else if (window.attachEvent) { 
    window.attachEvent('onload',somethingelse); 
} 

선호/기능적으로 함께 가지고있는가?

처럼
if (window.addEventListener) { 
    window.addEventListener('load',videoPlayer,false); 
    window.addEventListener('load',somethingelse,false); 
} else if (window.attachEvent) { 
    window.attachEvent('onload',videoPlayer,false); 
    window.attachEvent('onload',somethingelse); 
} 
+0

내가이 jQuery로 가능하다 알고있다. 사용할 옵션이있는 경우. –

답변

32

원하는대로 할 수 있습니다. 그것들은 함께 있어야 할 필요는 없으며 코드 컨텍스트에 따라 다릅니다. 물론, 이들을 조합 할 수 있다면 코드의 구조가 더 명확해질 수 있습니다 ("모든 이벤트 처리기를 추가하고 있습니다"라는 의미에서).

하지만 때때로 이벤트 리스너를 동적으로 추가해야합니다. 그러나 IE를 다루는 지 여부에 관계없이 여러 번 테스트 할 필요는 없습니다.

페이지를로드 할 때 사용할 수있는 방법을 한 번만 테스트하고이 테스트를 더 잘 수행하는 것이 좋습니다. 이런 식으로 뭔가 : 사용할 방법을 하면이 테스트됩니다

var addEventListener = (function() { 
    if(document.addEventListener) { 
     return function(element, event, handler) { 
      element.addEventListener(event, handler, false); 
     }; 
    } 
    else { 
     return function(element, event, handler) { 
      element.attachEvent('on' + event, handler); 
     }; 
    } 
}()); 

.

addEventListener(window, 'load',videoPlayer); 
addEventListener(window, 'load',somethingelse); 
+0

여기서 왜곡 된 함수가 바로 패턴이라고하는 이유는 무엇입니까? 더 간단하지 않을 것입니다. if (document.addEventListener) {addEventListener = ...} else {addEventListener = ...}'? – 6502

+1

스타일의 문제. 테스트를 주변 코드와 완전히 독립적이고 자체 "컨테이너"/ 컨텍스트에 보관하는 것과 같은 것으로 봅니다. 그러나 당신이 맞습니다.이 경우에는 필요하지 않습니다. –

+0

그냥 분명히 attachEvent가 오래되었습니다. IE를 사용하지 않아도됩니다. 모바일 타겟팅의 경우 검색에 대해 걱정할 필요가 없습니다. –

5

내가 사용하는이 기능 : 그럼 당신은 당신의 스크립트를 통해 이벤트를 첨부 할 수 있습니다에서

function addEvent (obj, type, fn) { 
    if (obj.addEventListener) { 

    obj.addEventListener(type, fn, false); 

    } else if (obj.attachEvent) { 

    obj.attachEvent('on' + type, function() { 

     return fn.call(obj, window.event); 

    }); 
    } 
} 
1
/** 
* multipleEventsListeners.js 
* Add the capability to attach multiple events to an element, just like jQuery does 
* https://gist.github.com/juanbrujo/a1f77db1e6f7cb17b42b 
*/ 

multipleEventsListeners(events, func, elem) { 
    elem = elem || document; 
    var event = events.split(' '); 
    for (var i = 0; i < event.length; i++) { 
    elem.addEventListener(event[i], func, false); 
    } 
} 

/* 
Use: 
var input = document.querySelector('input'); 
multipleEventsListeners(input, 'keyup change', function(e){ 
    console.log = this.value; 
}); 
*/ 

: https://gist.github.com/juanbrujo/a1f77db1e6f7cb17b42b

관련 문제