IE7:如何创建真正的NodeList?

时间:2011-04-15 14:45:20

标签: javascript dom internet-explorer-7 nodelist qsa

我正在尝试使我当前的项目与IE7兼容。我们没有使用jQuery,而是使用querySelectorAll来满足我们的选择器需求。但是,IE7不支持querySelectorAll,因此我使用https://gist.github.com/868532中的代码对其进行了修补。它实际上工作正常,除了一个小差异:而不是原始NodeList的{​​{1}},它返回一个数组。由于我希望保持尽可能兼容,我想让该函数返回querySelectorAll。使用在网上找到的一些方法,我已经改编了这个要点:

NodeList

我对此代码的问题是(function(d) { d=document, a = d.styleSheets[0] || d.createStyleSheet(); if (! vxJS.isHostMethod(d, 'querySelectorAll')) { d.querySelectorAll = function(e) { a.addRule(e,'f:b'); for (var l=d.all, b=0, c=d.createDocumentFragment(),f=l.length; b<f; b++) { l[b] && l[b].currentStyle.f && c.appendChild(l[b].cloneNode(true)); } a.removeRule(a.rules.length - 1); return c.childNodes; }; } })(); 从DOM树中的原始位置删除了一个节点,因此我尝试使用appendChild创建一个克隆,这显然会创建有效的节点克隆,而不是原始节点因此不能用于进一步的代码。

有什么办法可以将真正的节点引用放入NodeList吗?

2 个答案:

答案 0 :(得分:0)

我不认为可以做到。

IE7能够生成的NodeList实例是实时NodeLists。但是,querySelectorAll方法定义为返回静态NodeList实例。我不相信IE7知道静态NodeList是什么 - 那些(afaik)只在Selectors API中引入。

Read about live NodeLists and static NodeLists here.

答案 1 :(得分:0)

也许你可以通过添加item()方法使你的Array模仿NodeList。

if (!Array.prototype.item) {
    Array.prototype.item = function (i) {
        "use strict";

        return this[i];
    };
}