2012-04-14 4 views
0

여기 내 문제 : 왜이 ​​코드는 작동하지 않습니다 ????? ... 메시지가 내가 생각하는 가장 smiple 방법을 .... jfriend00 많이이벤트 리스너 크로스 브라우저

function test() 
    { 
    alert("test"); 
    } 

var EventsCrossBrowsers = 
{ 
    addEvents:(function(element,event,func) 
       { 
        if(element.addEventListener) 
        { 
         return elemenet.addEventListener(event,func,false); 
        } 
        else if(elemenet.attachEvent) 
        { 
         return elemenet.attachEvent("on"+event,func); 
        } 
       }()); 
} 

var x =document.getElementById("test"); 

EventsCrossBrowsers.addEvents(x,"click",test); 

덕분에 클릭 이벤트에 원소 (X)에 이벤트 리스너를 추가하려고 있어

표시되지 않습니다 : - 내가 당신을 다시 감사합니다 ... 수익을 이해하지 못하는 제외

function test() 
{ 
    alert("test"); 
} 

function addEventsCrossBrowsers(elemenet,event,func) 
{ 
    if(elemenet.addEventListener) 
    { 
     elemenet.addEventListener(event,func,false); 
    } 
    else if(elemenet.attachEvent) 
    { 
     elemenet.attachEvent("on"+event,func); 
    } 
} 
var x =document.getElementById("test"); 
addEventsCrossBrowsers(x,"click",test); 

두 번째 방법은 ... 당신의 방지 동작에

+7

모하메드, 당신의 질문을 downvoted, 그리고 가능성이되고있다 "일하지 않는다"는 말은하지 않았기 때문에 닫혀 야합니다. 오류 메시지가 나타 납니까? 전혀 아무 일도 일어나지 않습니까? 당신이 이것을 실행할 때마다 커다란 치즈 블록이 지붕을 빠져 나옵니까? [이 도움이되는 페이지] (http://stackoverflow.com/questions/how-to-ask)를 읽어보십시오. –

+5

크래커가 포함되어있는 경우 지붕을 통해 떨어지는 큰 치즈 블록은 버그가 아닙니다. – madth3

답변

13

거의 동일합니다 에, 당신은 동일한 철자가되어야 elemenetelement 모두를 사용하는 참조하십시오. 그것은 적어도 문제의 일부가 될 것입니다.

본인의 addEvents 함수는이 점에서 의미가없는 자체 실행 함수라는 것을 알았습니다. 그것은 단지 정상적인 기능을 해야하는 것 같습니다.

내 브라우저 간 이벤트 기능은 다음과 같습니다. 이벤트 처리기를 추가하는 기능 외에도 this 포인터와 events 개체를 정규화하여 모든 브라우저에서 동일하게 처리 할 수 ​​있습니다. 당신이 전파 및 기본 예방 옵션을 지정하지 않고 있지만 thisevent 정상화와 간단한 버전을하려는 경우

// add event cross browser 
function addEvent(elem, event, fn) { 
    // avoid memory overhead of new anonymous functions for every event handler that's installed 
    // by using local functions 
    function listenHandler(e) { 
     var ret = fn.apply(this, arguments); 
     if (ret === false) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     } 
     return(ret); 
    } 

    function attachHandler() { 
     // set the this pointer same as addEventListener when fn is called 
     // and make sure the event is passed to the fn also so that works the same too 
     var ret = fn.call(elem, window.event); 
     if (ret === false) { 
      window.event.returnValue = false; 
      window.event.cancelBubble = true; 
     } 
     return(ret); 
    } 

    if (elem.addEventListener) { 
     elem.addEventListener(event, listenHandler, false); 
     return {elem: elem, handler: listenHandler, event: event}; 
    } else { 
     elem.attachEvent("on" + event, attachHandler); 
     return {elem: elem, handler: attachHandler, event: event}; 
    } 
} 

function removeEvent(token) { 
    if (token.elem.removeEventListener) { 
     token.elem.removeEventListener(token.event, token.handler); 
    } else { 
     token.elem.detachEvent("on" + token.event, token.handler); 
    } 
} 

, 그이 될 것이다 :

// add event cross browser 
function addEvent(elem, event, fn) { 
    if (elem.addEventListener) { 
     elem.addEventListener(event, fn, false); 
    } else { 
     elem.attachEvent("on" + event, function() { 
      // set the this pointer same as addEventListener when fn is called 
      return(fn.call(elem, window.event)); 
     }); 
    } 
} 
+0

죄송합니다. 귀하의 코드를 이해할 수 없습니다. function listenHandler (e) { var ret = fn.apply (this, arguments); if (ret === false) { e.stopPropagation(); e.preventDefault(); } return (ret); } –

+1

@MohamedMahmoudZaki -이 이벤트 처리 추상화는 이벤트 처리기 함수가'false'를 반환하면 이벤트 전파 및 기본 처리를 중지하는 기능을 추가합니다. 이벤트 핸들러가 false를 반환하지 않거나 아무 것도 반환하지 않으면 해당 비헤이비어를 건너 뜁니다. 전파와 기본 동작은 구형 IE에서 다르기 때문에 이것 역시 추상화하는 것이 유용합니다. – jfriend00

+0

@MohamedMahmoudZaki - 이미 코드에 몇 가지 오류가 있습니다. 또한 주석에 여러 줄의 코드를 넣지 마십시오. 그것은 완전히 읽을 수 없습니다. 여러 줄 코드를 전달해야하는 경우'edit' 링크를 사용하여 질문에 추가 한 다음 추가 한 코드를 참조하여 주석을 추가하십시오. 자바 스크립트에 익숙하지 않다면, 이미 작동하는 두 개의 이벤트 처리 함수 중 하나를 선택하지 않는 이유는 무엇입니까? – jfriend00