2012-05-23 45 views
0

這是第一個:這兩個addEvent函數有什麼區別?

function addEvent(el, type, fn){ 
    if(el.addEventListener){ 
     el.addEventListener(type, fn, false); 
    }else{ 
     el[fn] = function(){ 
      fn.call(el, window.event); 
     } 
     el.attachEvent('on'+type, el[fn]); 
    } 
} 

與第二:

function addEvent(el, type, fn){ 
    if(el.addEventListener){ 
     el.addEventListener(type, fn, false); 
    }else{ 
     el['e' + fn] = function(){ 
      fn.call(el, window.event); 
     } 
     el.attachEvent('on'+type, el['e'+fn]); 
    } 
} 

第二個只需添加一個前綴,它是什麼用途的?

+0

這是jquery的源碼是否正確?它是哪個版本,都是同一版本的功能。 (有些上下文會對此有所幫助) – gideon

回答

1

在我看來,這兩個函數都嘗試做同樣的事情:以跨瀏覽器(即不支持.addEventListener()的舊IE版本)的方式綁定事件處理程序。如果.addEventListener()方法可用,則使用它,否則它會創建一個代理函數,以確保使用this和事件對象的相應值調用回調函數。

的差異只在el[fn]el['e' + fn]創建時以及後來的元素引用一個屬性:

el[fn] = function(){ 
     fn.call(el, window.event); 
    } 

addEvent()fn參數必須是一個函數引用,副手武器我不確定會發生什麼如果您使用函數引用作爲屬性名稱,但我猜測它實際上會對函數執行toString()並將結果用作屬性名稱。所以el['e' + fn]會做同樣的事情,但添加'e'到一開始。我沒有看到「e」有什麼特別的含義。