Javascript IE和DOM标准模型
有谁能简单地解释一下IE和DOM标准事件模型之间的区别吗?它们基本上做相同的事情*,但您只需确定客户端使用哪个浏览器就可以了。创建此命名空间以轻松确定要使用的事件模型:Javascript IE和DOM标准模型,javascript,dom,Javascript,Dom,有谁能简单地解释一下IE和DOM标准事件模型之间的区别吗?它们基本上做相同的事情*,但您只需确定客户端使用哪个浏览器就可以了。创建此命名空间以轻松确定要使用的事件模型: var Event = { add: function() { if (window.addEventListener) { return function(el, type, fn) { DOM.$(el).addEventListener(typ
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
AddEventListener
在末尾使用了一个额外的参数,它指示是使用事件捕获(true
)还是冒泡(false)。事件从DOM树的根元素向下或从DOM树的源元素向上触发,因此此标志确定event.stopPropagation
函数的作用。捕获意味着元素可以调用event.stopPropagation
来停止事件向其子元素的传播。冒泡意味着浏览器可以调用event.stopPropagation
来停止事件向其父元素的传播。它们主要做相同的事情*,但您只需确定客户端使用哪个浏览器来使用哪个。创建此命名空间以轻松确定要使用的事件模型:
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
AddEventListener
在末尾使用了一个额外的参数,它指示是使用事件捕获(true
)还是冒泡(false)。事件从DOM树的根元素向下或从DOM树的源元素向上触发,因此此标志确定event.stopPropagation
函数的作用。捕获意味着元素可以调用event.stopPropagation
来停止事件向其子元素的传播。冒泡意味着浏览器可以调用event.stopPropagation
来停止事件传播到其父元素。您的代码不符合DOM事件2:DOM事件从带有“捕获阶段”的文档元素开始,向下到目标,然后向上冒泡到文档元素。在IE中实现这一点是相当困难的
例如:
<body> <div id="div1"><div id=div2></div></div></body>
如果在div2上触发“click”事件,eventListeners将作为:
- 文件(第一阶段)
- 机构(第一阶段)
- 第一组(第一期)
- 第二组(第二期)
- 第一组(第三期)
- 机构(第三阶段)
- 文件(第三阶段)
在您的代码中,您假设所有侦听器都处于气泡阶段,但这不是一个好主意,因为例如“focus”事件没有气泡阶段,并且不能与您的代码正确运行。您的代码不符合DOM event 2:DOM事件从带有“capture phase”的文档元素开始,一直到目标,然后向上冒泡到文档元素。在IE中实现这一点是相当困难的 例如:
<body> <div id="div1"><div id=div2></div></div></body>
如果在div2上触发“click”事件,eventListeners将作为:
- 文件(第一阶段)
- 机构(第一阶段)
- 第一组(第一期)
- 第二组(第二期)
- 第一组(第三期)
- 机构(第三阶段)
- 文件(第三阶段)
在您的代码中,您假设所有侦听器都处于气泡阶段,但这不是一个好主意,因为例如“焦点”事件没有气泡阶段,并且不能与您的代码正确运行。DOM在理论上是这个标准化的事件模型,还有IE,一个丑陋的古代恶魔,它不会死,或者你的意思是事件侦听器之间有什么不同?维基百科上有一个很好的讨论:。当然,这是维基百科,所以请恕我直言。DOM在理论上是一个标准化的事件模型,还有IE,一个丑陋的古老邪恶恶魔,它不会死,或者你是说事件侦听器有何不同?维基百科上有一个很好的讨论:。当然,这是wikipedia,所以请不要吝啬。你的
事件.remove
实现在IE中不起作用。让它起作用不是件小事,我怀疑这就是为什么Dustin一开始就把它从他的实现中漏掉的原因。@Crescent Fresh:是的,我刚刚复制并粘贴了代码。我删除了有问题的部分,留下了有助于解释的部分。您对addEventListener
的第三个参数的解释不正确:您似乎暗示它控制事件是否从其原始目标传播,而实际上它对事件是否传播没有影响,它是如何做到的:将其设置为true
意味着事件从文档根向下经过树,直到到达目标;如果false
则相反,即从事件的目标开始,并向上(冒泡)到文档根。你的事件.remove
实现在IE中不起作用。让它起作用不是件小事,我想这就是为什么Dustin一开始就把它从他的实现中漏掉的原因。@Crescent Fresh:是的,我刚刚复制并粘贴了代码。我删除了有问题的部分,留下了有助于解释的部分。您对addEventListener
的第三个参数的解释不正确:您似乎暗示它控制事件是否从其原始目标传播,而实际上它对事件是否传播没有影响,它是如何做到的:将其设置为true
意味着事件从文档根向下经过树,直到到达目标;如果false
则相反,即从事件的目标开始,并向上(冒泡)到文档根。