我想你的意思是:
window.addEventListener("resize", this.onResize);
onresize
现代浏览器中没有事件之类的东西,但onresize
DOM 中有一个属性。
有人可以解释为什么存在这两种方法吗?
'内联处理程序;出于历史/向后兼容性的原因而存在,并反映了可以添加到 HTML 标记中的属性。以同样的方式,您拥有一个click
事件、一个onclick
DOM 属性和一个onclick
属性 - 该模式在许多其他事件中重复出现。
这些内联事件处理程序是在 JavaScript 首次出现时在 Netscape 2.0 中实现的。从那以后他们就一直存在,因为该模型简单明了、易于理解且易于复制和粘贴,而且没有人通过破坏现有 Web 内容使 Web 浏览器流行起来,但如果你是一名专业的 Web 开发人员,你应该永远不要使用它们。
内联事件注册有许多限制,最明显的是每个元素只能有一个属性/属性。Netscape 和 Microsoft 开发了更高级(但不兼容)的模型,然后 W3C 尝试在所有现代浏览器都实现的DOM Level 2 规范中进行标准化。
但是 IE 继续使用 Microsoft 的专有模型,直到第 9 版,这可能使您的第一个示例感到困惑:
window.attachEvent('onresize',this.onResize);
主要浏览器之间事件处理的这种根本不兼容是推动创建许多 JavaScript 框架(如jQuery )的主要因素之一(与 XHR 一起) 。
它们可以互换吗?
如果您同时添加一个内联事件处理程序并附加一个addEventListener
,只要您没有故意取消该事件,两个处理程序都会运行(也就是说 - 它们不是同一件事)。但是,为了防止未来的精神错乱,我建议坚持使用更现代的方法。
最后,在 dom 的任何地方都有静态事件列表吗?
不,任何一个标准中甚至都没有一个通用列表,因为事件本身往往是在相关的规范中定义的,而不是与机制的定义一起定义。如果您担心浏览器对特定事件的支持,您可能想要定义类似的函数isEventSupported()
或使用 Modernizr 。