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 селекторов.

Читайте о живых NodeLists и статических NodeLists здесь.

Другие вопросы по тегам