【问题标题】:IE7 Queryselector not finding elementsIE7 Queryselector 找不到元素
【发布时间】:2018-11-29 13:05:48
【问题描述】:

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.log(tabs.length);
console.log(hireTabs.length);
console.log(salesTabs.length);
console.log(descriptionTabs.length);
console.log(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 之外的其他任何地方。

编辑:将代码更改为 sn-p。

编辑:我已经通过逐步解决问题。

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

这条线似乎适用于某些元素而不适用于其他元素,因此它们不会被推送。据我所知,没有区别

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

哪个有效并且

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

没有。

FinalEdit(我放弃):结果似乎因查询选择器的顺序而异。

【问题讨论】:

  • 如果您需要做的只是匹配标签、ID 和类名,我会选择使用 getElementById()、getElementsByClassName() 和 getElementsByTagName(),而不是仅适用于特定实例的 CSS hack IE。恕我直言,使用此 hack 的唯一原因是当您需要复杂的 CSS 选择器时。
  • 当 dom 准备好时,你能确认你正在调用这一切吗?
  • 告诉 IE7 用户使用现代浏览器真的很容易。那些旧版本中有很多怪癖。曾经是专门用于“IE Hacks”的整个网站
  • 这是一个单独的脚本,用于早期版本的 IE。我在另一个脚本中使用 getElementsByClassName。
  • 将 id 添加到父元素并过滤它们的 childNodes 列表以使其适用于所有浏览器不是更容易吗?然后浏览器至少可以优化那些 childNode 循环。与需要解析的 CSS 表达式相比,然后无论如何都会遍历 DOM 以找到正确的元素。它只是遇到了很多额外的问题(IE 的单独脚本、使用 eval 的 CSS 表达式导致的安全问题、IE 版本之间的不兼容、并非所有 CSS 选择器都在 IE 中可用)只是为了能够使用 querySelector() 语法。

标签: javascript internet-explorer-7


【解决方案1】:

经过一番挖掘,我在 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 版本。我刚刚更换了之前使用的 polyfill。

【讨论】:

    【解决方案2】:

    不支持,https://caniuse.com/#feat=queryselector

    您可以使用 findElementByIdfindElementByClassName 等替代方法

    【讨论】:

    • 这就是为什么我将顶部的功能作为 polyfill。 if (!document.querySelectorAll)
    • 查询选择器正在工作。如果您可以在我的代码中的某些控制台日志中看到它返回的数量是正确的。
    • @Shemiroth,您能否详细描述或举例说明。你是什​​么意思,“结果似乎因查询选择器的顺序而异。”我还想与您确认您正在尝试使用哪个实际版本的 IE 进行测试?如果是 IE 11,建议你用实际的 IE 7 进行测试。文档模式在很多情况下不会给出准确的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2022-10-13
    • 2014-12-25
    相关资源
    最近更新 更多