IE7: Как мне создать настоящий NodeList?
Я пытаюсь сделать мой текущий проект 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?
2 ответа
Возможно, вы можете создать массив, имитирующий NodeList, добавив метод item().
if (!Array.prototype.item) {
Array.prototype.item = function (i) {
"use strict";
return this[i];
};
}
Я не думаю, что это можно сделать.
Экземпляры NodeList, которые IE7 может создавать, являются живыми NodeList. Тем не менее querySelectorAll
Метод определен для возврата статического экземпляра NodeList. Я не верю, что IE7 знает, что такое статический NodeList - они были (afaik) только в API селекторов.