2010-09-09 32 views
1

任何人都可以用簡單的術語解釋IE和DOM標準事件模型之間的區別嗎?IE和DOM標準模型

+2

DOM是這個標準化的事件模型*在理論上*,然後是IE,一個醜陋的古代邪惡的惡魔,**不會死亡**,或者你的意思是事件聽衆如何不同? – 2010-09-09 19:41:08

+0

維基百科上有一個很好的討論:http://en.wikipedia.org/wiki/DOM_events。當然,它是維基百科,所以拿一塊鹽。 – 2010-09-09 20:42:48

回答

0

他們主要是做同樣的事情*,但你只需要確定哪一個瀏覽器使用你的客戶端使用哪一個。 Dustin Diaz創造了這個命名空間可以輕鬆地確定要使用的事件模型:

var Event = { 
    add: function() { 
     if (window.addEventListener) { 
      return function(el, type, fn) { 
       DOM.$(el).addEventListener(type, fn, false); 
      }; 
     } else if (window.attachEvent) { 
      return function(el, type, fn) { 
       var f = function() { 
        fn.call(DOM.$(el), window.event); 
       }; 
       DOM.$(el).attachEvent('on' + type, f); 
      }; 
     } 
    }() 
}; 

* - 我說「大多是」同樣的事情,因爲你會發現,DOM addEventListenter需要一個額外的參數,在年底,這表明是否使用事件捕獲true)或冒泡(false)。事件從DOM樹中的根元素或DOM樹中的源元素開始,因此此標誌確定event.stopPropagation函數的功能。 捕獲意味着該元素可以調用event.stopPropagation來停止事件傳播到其子元素。 Bubbling意味着瀏覽器可以調用event.stopPropagation來停止事件傳播到其父元素。

+0

你的'Event.remove'實現在IE中不起作用。讓它工作並不是微不足道的,我懷疑這就是爲什麼達斯汀首先將它從實施中解放出來的原因。 – 2010-09-09 21:00:54

+0

@Crescent Fresh:是的,我只是複製並粘貼了代碼。我刪除了有問題的部分,並留下了有助於解釋的部分。 – palswim 2010-09-09 21:14:32

+0

您對addEventListener的第三個參數的解釋是不正確的:您似乎暗示它控制着事件是否會從其原始目標傳播,而實際上它對事件是否傳播沒有影響,只是它是如何實現的:將其設置爲「true」意味着事件從文檔根開始直到樹到達目標;當「錯誤」時,它會做相反的事情,即從事件的目標開始並將樹進行(冒泡)到文檔根目錄。 http://www.w3.org/TR/DOM-Level-2-Events/events。html#Events-flow-capture – 2010-09-09 23:18:43

1

您的代碼不符合DOM事件2:dom事件從具有「捕獲階段」的文檔元素開始,向下到目標,然後向上冒泡到文檔元素。在IE中實現它是相當困難的。

實施例:

<body> <div id="div1"><div id=div2></div></div></body> 

如果 「點擊」 DIV2事件觸發時,事件監聽器作爲運行:

  • 文檔(階段1)
  • 體(相1)
  • DIV1(階段1)
  • div2(階段2)
  • div1(ph ASE 3)
  • 體(第3階段)
  • 文件(第3階段)

在你的代碼假設所有的聽衆都在泡沫階段,但是這是不是一個好主意,因爲如「焦點「事件沒有泡沫階段,並且不能與代碼一起正確運行。