Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IE和DOM标准模型_Javascript_Dom - Fatal编程技术网

Javascript 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

有谁能简单地解释一下IE和DOM标准事件模型之间的区别吗?

它们基本上做相同的事情*,但您只需确定客户端使用哪个浏览器就可以了。创建此命名空间以轻松确定要使用的事件模型:

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
则相反,即从事件的目标开始,并向上(冒泡)到文档根。