如何解决IE7:如何创建真实的NodeList?
| 我正在尝试使我当前的项目与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。但是,定义了“ 0”方法以返回静态NodeList实例。我不相信IE7知道静态NodeList是什么-仅在Selectors API中才引入(afaik)。
在此处阅读有关实时NodeList和静态NodeList的信息。
,也许可以通过添加item()方法使Array模仿NodeList。
if (!Array.prototype.item) {
Array.prototype.item = function (i) {
\"use strict\";
return this[i];
};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。