Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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中,可以扩展DOM吗?_Javascript_Dom - Fatal编程技术网

在Javascript中,可以扩展DOM吗?

在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

在Javascript中,可以使用其原型对象扩展现有类:

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'
    });
});