IE和DOM标准模型

时间:2010-09-09 19:36:40

标签: javascript dom

有人能用简单的术语向我解释IE和DOM标准事件模型之间的区别吗?

2 个答案:

答案 0 :(得分:1)

您的代码不符合DOM事件2:dom事件从具有“捕获阶段”的文档元素开始,然后向下到目标,然后向上冒泡到文档元素。在IE中实现它非常困难。

示例:

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

如果“click”事件在div2上触发,则eventListeners运行为:

  • 文件(第1阶段)
  • 身体(阶段1)
  • div1(阶段1)
  • div2(阶段2)
  • div1(阶段3)
  • 身体(阶段3)
  • 文件(第3阶段)

在您的代码中,您假设所有侦听器都处于泡沫阶段,但这不是一个好主意,因为例如“焦点”事件没有泡沫阶段,并且无法正确运行您的代码。

答案 1 :(得分: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来停止事件传播到其子元素。 冒泡表示浏览器可以调用event.stopPropagation来阻止事件传播到其父元素。