扩展 DOM 元素的原型比扩展内置对象更糟糕†</sup>。请查看文章“扩展 DOM 有什么问题”。
jQuery 提供的是一个简单的 DOM API包装器,这没问题。扩展 DOM 的问题在于
- 它们是宿主对象,其行为可能与 ECMAScript 规范中定义的对象不同,并且
- 较旧的 IE 版本甚至不公开 DOM 节点的原型。
我这样做的原因是我试图创建一个附加事件的跨浏览器实现,而不必一直执行 if 语句。
仅凭这一点就没有理由扩展 DOM。您可以定义自己的函数来绑定事件处理程序,您甚至必须在页面加载时测试addEventListener
是否attachEvent
仅存在一次。这样的函数可能如下所示:
var bindEvent = (function() {
if (document.addEventListener) {
return function(element, event, handler) {
element.addEventListener(event, handler, false);
};
}
else {
return function(element, event, handler) {
element.attachEvent("on" + event, function() {
handler.call(element, window.event);
}
};
}
}());
您可以在这样的函数中进行大量规范化。例如,当使用attachEvent
,this
通常不引用处理程序绑定到的元素(它引用window
),这与 with 不同addEventListener
。此外,您可能知道,事件对象不会作为参数传递给 IE 中的处理程序。这两个问题都通过这条线解决了:
handler.call(element, window.event);
(缺点是你不能简单地移除处理程序,因为你没有handler
直接绑定,但这些问题也可以解决)。
您可以在 quirksmode.org 上的优秀文章中找到有关这些浏览器差异的更多信息和更多信息。
†:由于浏览器提供Object.defineProperty
了将属性标记为不可枚举的可能性,因此扩展内置对象不再那么糟糕了,但如果库开始使用它,名称冲突、方法覆盖和不兼容的可能性就会更高。
对于您自己的代码,应该没问题。DOM 对象仍然应该是一个禁忌。