扩展DOM但不是元素原型..可能吗?

时间:2012-06-01 20:08:37

标签: javascript dom element extend

如果你想在DOM中我想扩展一些组或类,但我不希望扩展所有的元素。有可能吗?

例如:

document.getElementsByClass('extended').myMethod(); // working

BUT

document.getElementById('elementNotExtendedClass').myMethod(); // shouldnt be working

因为我不想弄乱所有元素,只选择所选元素。 也许它应该通过在文档中创建我自己的createElement()方法版本来完成。例如document.CreateMyElement()。

还是有什么想法?感谢

编辑6月06日: 我正在寻找原型链保持工作的解决方案,因此我可以立即更改一些共享方法和属性。

2 个答案:

答案 0 :(得分:2)

为什么不将方法添加到每个实例(fiddle

function test() {
    this.style.fontWeight = "bold";
}

window.onload = function(){
    // add your method to existing elements with class 'extended'
    var elements = document.getElementsByClassName('extended');
    for (var i = 0; i < elements.length; i++){        
        elements[i].test = test;
    }
    // just to visualize what happened...
    var spans = document.getElementsByTagName("span");
    alert("span[0].test: " + typeof spans[0].test
          +"\nspan[1].test: " + typeof spans[1].test); 
    spans[0].test();
};

答案 1 :(得分:0)

<强>更新

此方法将定义一个全局接口,您可以在其上定义扩展方法。将它们放在这样的界面中允许您更改方法而无需重新应用它。

MyExtendedInterface = {
    test: function() {
        // this points to the DOM element itself
        console.log(this);
    }
}

var elements = document.getElementsByClassName('extended');
for (var i = 0, el; el = elements[i]; ++i) {
    for (var j in MyExtendedInterface) {
        // bind the interface methods to the current element
        el[j] = MyExtendedInterface[j].bind(el);
    }
}

.bind()是JavaScript的最新成员;另见:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind