IE7 Queryselector не находит элементы

if (!document.querySelectorAll)
  document.querySelectorAll = function(selector) {
    var head = document.documentElement.firstChild;
    var styleTag = document.createElement("STYLE");
    head.appendChild(styleTag);
    document.__qsResult = [];

    styleTag.styleSheet.cssText = selector+"{x:expression(document.__qsResult.push(this))}";
    window.scrollBy(0, 0);
    head.removeChild(styleTag);

    var result = [];
    for (var i in document.__qsResult)
      result.push(document.__qsResult[i]);
    return result;
  }

 var tabs = document.querySelectorAll(".tab");
 var descriptionTabs = document.querySelectorAll(".descriptionTab");
 var hireTabs = document.querySelectorAll(".hireTab");
 var salesTabs = document.querySelectorAll(".salesTab");
 var lazyImages = document.querySelectorAll(".lazy");



console.info(tabs.length);
console.info(hireTabs.length);
console.info(salesTabs.length);
console.info(descriptionTabs.length);
console.info(lazyImages.length);
<img class = "imageThumbs lazy" src = "">
<img class = "imageThumbs lazy" src = "">
<img class = "imageThumbs lazy" src = "">
<img class = "imageThumbs" src = "">

<div class = "tabContainer">
     <div class = "descriptionTab tab">Description</div>
     <div class = "hireTab tab">HireTab</div>
     <div class = "salesTab tab">SalesTab</div>
</div>

У меня странная проблема с IE, режим документа 7.

Самое странное в этом то, что мои функции отлично работают в режимах документа 5 и 8.

Некоторые элементы не обнаружены. Когда я проверяю инструменты разработчика браузера, они там, в HTML-документе.

Я не понимаю, почему они неверны в этой конкретной версии IE, а все остальные работают нормально.

Надеюсь, у кого-то есть идея. Заранее спасибо.

Обновлено:

Это отдельный сценарий, предназначенный только для более ранних версий IE. Я использую getElementsByClassName в другом скрипте.

Тег скрипта находится внизу HTML-страницы.

Работает везде, кроме IE7.

Обновлено: измените код на фрагмент.

Обновлено: Я определил проблему, пройдя через нее.

styleTag.styleSheet.cssText = selector+"{x:expression(document.__qsResult.push(this))}";

Эта строка, похоже, работает с некоторыми элементами, а не с другими, поэтому они не нажимаются. Насколько я понимаю, разницы между

var descriptionTabs = document.querySelectorAll(".descriptionTab");

Что работает и

var hireTabs = document.querySelectorAll(".hireTab");

Но это не так.

FinalEdit (я сдаюсь): кажется, что результаты различаются в зависимости от того, в каком порядке расположены селекторы запросов.

Если все, что вам нужно сделать, это сопоставить теги, идентификаторы и имена классов, я бы предпочел использовать getElementById (), getElementsByClassName () и getElementsByTagName () вместо взлома CSS, который работает только с определенными экземплярами IE. Имхо, единственная причина использовать этот хак - это когда вам нужны сложные селекторы CSS.

Shilly 29.11.2018 14:21

Вы можете подтвердить, что вызываете все это, когда дом будет готов?

Jai 29.11.2018 14:23

Было бы очень легко сказать пользователю IE7 использовать современный браузер. Так много причуд в старых версиях. Раньше были целые сайты посвященные "IE Hacks"

charlietfl 29.11.2018 14:23

Это отдельный сценарий, предназначенный только для более ранних версий IE. Я использую getElementsByClassName в другом скрипте.

user6439507 29.11.2018 14:23

Не будет ли проще просто добавить идентификаторы к родительским элементам и отфильтровать их список childNodes, чтобы он работал во всех браузерах? Тогда браузер сможет хотя бы оптимизировать эти циклы childNode. По сравнению с выражениями CSS, которые необходимо проанализировать, а затем в любом случае перебирать DOM в цикле, чтобы найти правильные элементы. Это просто вызывает множество дополнительных проблем (отдельный скрипт для IE, проблемы безопасности из-за выражений CSS с использованием eval, несовместимость между версиями IE, не все селекторы CSS, доступные в IE), просто чтобы иметь возможность использовать синтаксис querySelector ().

Shilly 29.11.2018 14:32

Не совсем потому, что на каждой странице будет разное количество элементов.

user6439507 29.11.2018 15:33

Обновите свой вопрос, добавив минимальный воспроизводимый пример, демонстрирующий проблему (включая HTML), в идеале работоспособный с использованием Stack Snippets (кнопка панели инструментов [<>]; вот как это сделать). Например, элементы .tab не обнаружены. Здорово! Таким образом, вы сможете создать MCVE с одним элементом .tab.

T.J. Crowder 29.11.2018 17:22

Я добавил фрагмент, но проблема, с которой я столкнулся, связана с IE7. Проблема не будет воспроизведена во фрагменте.

user6439507 29.11.2018 17:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
740
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не поддерживается, https://caniuse.com/#feat=queryselector

Вы можете использовать альтернативы, такие как findElementById или findElementByClassName.

Вот почему у меня есть функция сверху как полифилл. если (! document.querySelectorAll)

user6439507 29.11.2018 14:08

Может это поможет? stackoverflow.com/questions/18404362/…

Alejandro Garcia Anglada 29.11.2018 14:11

Селектор запросов работает. Если вы можете видеть мой код в некоторых журналах консоли, он возвращает правильную сумму.

user6439507 29.11.2018 14:21

@Shemiroth, Подскажите пожалуйста подробно или на примере. что вы имеете в виду под «кажется, что результаты различаются в зависимости от того, в каком порядке расположены селекторы запросов»? Я также хочу подтвердить вам, с какой актуальной версией IE вы пытаетесь протестировать? Если это IE 11, то я предлагаю вам провести тест с фактическим IE 7. Режим документа не даст точных результатов во многих условиях.

Deepak-MSFT 30.11.2018 03:21
Ответ принят как подходящий

Покопавшись, я нашел решение на Github.

https://gist.github.com/Fusselwurm/4673695

(function () {
    var
        style = document.createStyleSheet(),
        select = function (selector, maxCount) {
            var
                all = document.all,
                l = all.length,
                i,
                resultSet = [];

            style.addRule(selector, "foo:bar");
            for (i = 0; i < l; i += 1) {
                if (all[i].currentStyle.foo === "bar") {
                    resultSet.push(all[i]);
                    if (resultSet.length > maxCount) {
                        break;
                    }
                }
            }
            style.removeRule(0);
            return resultSet;

        };

    //  be rly sure not to destroy a thing!
    if (document.querySelectorAll || document.querySelector) {
        return;
    }

    document.querySelectorAll = function (selector) {
        return select(selector, Infinity);
    };
    document.querySelector = function (selector) {
        return select(selector, 1)[0] || null;
    };
}());

Это работает во всех более ранних версиях IE. Я просто заменил полифилл, который использовал ранее.

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