使用querySelectorAll后无法将元素推送到数组

时间:2016-05-03 17:09:52

标签: javascript arrays oop prototype

所以我有一个很少属性的简单类。使用原型我添加了一些方法。这些方法返回this,所以我可以将tham链接在一起。

Get方法找到所有元素并放入allCurrentElements,这是一个数组(或者至少我认为是这样)。当我使用CreateElement方法时,它只是创建元素并尝试将其推送到现有数组allCurrentElements

要使用它,只需编写var a = _h.Get('p').CreateElement('div')即可。这是我收到错误Uncaught TypeError: this.allCurrentElements.push is not a function(…)的地方。

如果我尝试使用索引分配新创建的元素,它不会抛出错误,但是此元素不会出现在数组中。

var _h = (function(){
    var Helper = function(){
        this.allCurrentElements = [];
    }

    Helper.prototype.Get = function(query){
        this.allCurrentElements = document.querySelectorAll(query);
        return this;
    }

    Helper.prototype.CreateElement = function(el, attr) {
        var elem = document.createElement(el);
        for (var a in attr) {
            elem[a] = attr[a];
        }

        //this.allCurrentElements[this.allCurrentElements.length] = elem;
        this.allCurrentElements.push(elem);
        return this;
    }

    return new Helper();
})();

https://jsfiddle.net/Ldp58onu/

2 个答案:

答案 0 :(得分:4)

document.querySelectorAll()返回NodeList,这是一个类似于数组的对象。

问题是NodeLists是只读的。你需要在数组中转换它。 Array.prototype.slice.call(document.querySelectorAll(query));

之后,你就可以随心所欲。

答案 1 :(得分:3)

您必须查看Document.querySelectorAll()文档https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll

返回所有匹配元素节点的非实时NodeList。

NodeList与数组非常相似,并且很容易在它们上调用Array.prototype方法,但NodeList对象没有任何熟悉的Array方法。

所以你必须迭代NodeList,如:

Array.prototype.forEach.call(document.querySelectorAll(query), function(element){ 

        allCurrentElements.push(element);

});