0

作为一名 AS3 开发人员,我已经习惯了:

addEventListener(Event.RESIZE, onResize);

我正在尝试学习 Typescript/JS/HTML5,并且不断看到所有这些不同的做事方式。

我喜欢这种风格:

window.addEventListener("resize", this.onResize);

我讨厌这种风格:

window.onresize = function();

有人可以解释为什么存在这两种方法吗?它们可以互换吗?如果我在 dom API 参考上看到 window.onfoo,我可以使用 window.addEventListener("onfoo", this.onFoo);

最后,在 dom 的任何地方都有静态事件列表吗?我可以说 Event.onresize 还是需要输入字符串?

4

1 回答 1

2

我想你的意思是:

window.addEventListener("resize", this.onResize);

onresize现代浏览器中没有事件之类的东西,但onresizeDOM 中有一个属性。

有人可以解释为什么存在这两种方法吗?

'内联处理程序;出于历史/向后兼容性的原因而存在,并反映了可以添加到 HTML 标记中的属性。以同样的方式,您拥有一个click事件、一个onclickDOM 属性和一个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 。

于 2013-05-01T22:31:52.663 回答