IE7: Как мне создать настоящий NodeList? - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь сделать мой текущий проект 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 ]

0 голосов
/ 24 февраля 2012

Возможно, вы можете создать массив, имитирующий NodeList, добавив метод item ().

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

        return this[i];
    };
}
0 голосов
/ 16 апреля 2011

Я не думаю, что это можно сделать.

Экземпляры NodeList, которые IE7 может создавать, являются живыми NodeLists.Однако метод querySelectorAll определен для возврата статического экземпляра NodeList.Я не верю, что IE7 знает, что такое статический NodeList - они были (afaik) только в API селекторов.

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

...