我正在尝试使我当前的项目兼容 IE7。我们没有使用 jQuery,而是使用 querySelectorAll
来满足我们的选择器需求。但是,IE7 不支持 querySelectorAll
,因此我使用 https://gist.github.com/868532 中的代码对其进行了猴子修补。 。它实际上工作得很好,除了一个小区别:它返回一个数组,而不是像原始 querySelectorAll
那样的 NodeList
。由于我希望尽可能保持兼容性,因此我想让该函数返回一个 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 中吗?
最佳答案
我认为这是不可能的。
IE7 能够生成的 NodeList 实例是实时 NodeList。但是,querySelectorAll
方法被定义为返回静态 NodeList 实例。我不相信 IE7 知道静态 NodeList 是什么 - 这些(据我所知)仅在 Selectors API 中引入。
关于javascript - IE7 : How do I create a real NodeList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5678446/