1

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

例如:

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

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

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

或者有什么想法?谢谢

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

4

2 回答 2

2

为什么不将方法添加到每个实例(小提琴

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();
};
于 2012-06-01T20:16:31.863 回答
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

于 2012-06-03T10:18:17.063 回答