1

我正在尝试使我当前的项目与 IE7 兼容。我们没有使用 jQuery,而是使用querySelectorAll我们的选择器需求。但是,IE7 不支持querySelectorAll,所以我使用来自https://gist.github.com/868532的代码对其进行了猴子修补。它实际上工作正常,除了一个小区别:它返回一个数组,而不是NodeList像原来的那样。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;
         };
     }
 })();

我对这段代码的问题是appendChild从它在 DOM 树中的原始位置删除了一个节点,因此我尝试使用 来创建一个克隆cloneNode,这显然会创建有效的节点克隆,它们不是原始节点,因此不能在进一步的代码中使用。

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

4

2 回答 2

0

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

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

        return this[i];
    };
}
于 2012-02-24T13:00:09.180 回答
0

我不认为它可以做到。

IE7 能够生成的 NodeList 实例是活动的 NodeList。但是,该querySelectorAll方法被定义为返回一个静态 NodeList 实例。我不相信 IE7 知道静态 NodeList 是什么——那些(afaik)仅在 Selectors API 中引入。

在此处阅读有关实时 NodeList 和静态 NodeList 的信息。

于 2011-04-15T21:24:38.393 回答