在Javascript中,可以扩展DOM吗?
在Javascript中,可以使用其原型对象扩展现有类:在Javascript中,可以扩展DOM吗?,javascript,dom,Javascript,Dom,在Javascript中,可以使用其原型对象扩展现有类: String.prototype.getFirstLetter = function() { return this[0]; }; 是否可以使用此方法扩展DOM元素?我在写问题时找到了答案,但我想还是发帖子来分享信息 需要扩展的对象是Element.prototype Element.prototype.getMyId = function() { return this.id; }; 您可以通过使用元素的原型来扩展D
String.prototype.getFirstLetter = function() {
return this[0];
};
是否可以使用此方法扩展DOM元素?我在写问题时找到了答案,但我想还是发帖子来分享信息 需要扩展的对象是
Element.prototype
Element.prototype.getMyId = function() {
return this.id;
};
您可以通过使用元素的原型来扩展DOM。但是,这在IE7和更早版本中不起作用。您需要一次扩展一个特定元素。原型库就是这样做的。我建议您仔细查看,看看它是如何完成的。可以,但强烈建议不要这样做 如果您重写了另一个库期望的原始内容,或者另一个库重写了您期望的内容。。混乱
最好的做法是将代码保留在自己的名称空间/作用域中。您不应该直接扩展任何东西(我所说的“任何东西”是指本机DOM对象)——这只会导致不好的结果。另外,重新扩展每个新元素(支持IE需要做的事情)会增加额外的开销 为什么不采用jQuery方法,创建一个包装器/构造函数并扩展它:
var myDOM = (function(){
var myDOM = function(elems){
return new MyDOMConstruct(elems);
},
MyDOMConstruct = function(elems) {
this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems];
return this;
};
myDOM.fn = MyDOMConstruct.prototype = {
forEach : function(fn) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
fn( elems[i], i );
}
return this;
},
addStyles : function(styles) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
for (var prop in styles) {
elems[i].style[prop] = styles[prop];
}
}
return this;
}
};
return myDOM;
})();
请注意,这仅适用于IE6和IE7,因为IE8支持这一点。请看。是的,IE8在DOM操作方面取得了很大的进步,但是完全支持它现在并不是我的首要任务。“你不应该直接扩展任何东西——这只会导致不好的事情。”如果你有一个很好的理由这样做并正确地编写代码,它将带来好的事情。除了互操作性问题,没有理由不扩展Element.prototype;对于其他默认对象,可以有很多好处(请参阅将格式化方法添加到Date.prototype或转义到RegExp.prototype)。当完全有用的OO实践可用且有用时,放弃它们是愚蠢的。我们不是在讨论JavaScript语言和设计模式或诸如此类的东西。这是关于DOM的——扩展本地DOM对象不是一个好主意;更不用说它在所有浏览器中都不能正常工作了……它过去是个坏主意,现在也不坏了。你可以。但可能不应该:)事实上,在过去三年里,情况发生了变化:
myDOM(document.getElementsByTagName('*')).forEach(function(elem){
myDOM(elem).addStyles({
color: 'red',
backgroundColor : 'blue'
});
});