2012-04-14 107 views
0

我的問題在這裏:爲什麼不這個代碼工作????? ......該消息未出現添加事件監聽器跨瀏覽器

我試圖將事件偵聽器添加到元素x事件單擊

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); 

非常感謝jfriend00 .... 最smiple方式,我認爲: -

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)。 – 2012-04-14 00:35:27

+5

如果包括餅乾,一大塊落在屋頂的奶酪並不是一個錯誤。 – madth3 2012-04-14 01:26:40

回答

13

在你functi上,我看到你正在使用elemenetelement他們應該是相同的拼寫。這至少是問題的一部分。

我也看到你的addEvents函數是一個自我執行的函數,在這方面沒有意義。它似乎應該只是一個正常的功能。

這是我的跨瀏覽器事件函數。除了添加一個用於添加事件處理程序的功能之外,它還將this指針和events對象標準化,以便在任何瀏覽器中對它們進行對待。

// 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); 
    } 
} 

如果你想不傳播和默認的預防辦法,但與thisevent正常化簡單的版本,這將是這樣的:

// 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); (ret === false){ e.stopPropagation(); e.preventDefault(); } return(ret); } – 2012-04-14 00:56:45

+1

@MohamedMahmoudZaki - 這個事件處理抽象增加了一個特性,如果事件處理函數返回'false',那麼它將停止事件的傳播和默認處理。如果事件處理程序不返回false或不返回任何內容,則會跳過該行爲。由於傳播和默認行爲在較舊的IE中不同,因此對此也進行抽象很有用。 – jfriend00 2012-04-14 01:02:34

+0

@MohamedMahmoudZaki - 我已經在您的代碼中爲您提供了一些錯誤。另外,請不要在評論中添加多行代碼。這是完全不可讀的。如果您需要溝通多行代碼,那麼使用'edit'鏈接並將其添加到您的問題中,然後添加一個引用您添加的代碼的評論。如果你是新來的JavaScript,爲什麼你不會只使用我已經工作的兩個事件處理函數中的一個? – jfriend00 2012-04-14 01:47:05