6

我正在运行一些使用它的javascript:

controls = document.querySelectorAll("input,textarea,button");

它应该适用于 IE 9(这是开发人员和客户使用的版本)。但是在我们的项目中,我们使用了一些非常古老的 Web 组件,它们只能在兼容模式下正常工作。而 querySelectorAll 仅适用于我在研究后发现的标准模式。

有没有其他选择?

编辑:它在 Chrome 和 FF 上运行良好

4

3 回答 3

14

querySelectorAll在 IE9 中运行良好。它甚至可以在 IE8 中运行。

但听起来你的问题是让它专门在怪癖模式或兼容模式下工作。

如果那是问题,那么......好吧,问题是模式,而不是功能。您需要使站点进入标准模式,然后querySelectorAll才能工作。

兼容模式的重点是让浏览器模拟旧版本的 IE。它执行此操作的主要方法是禁用自该版本以来添加的所有功能。

所以基本上你说的是“我已经关闭了浏览器中的一半功能,我怎样才能让其中一个功能再次工作?”

显而易见的答案是:再次打开这些功能。

这样做的方法是确保浏览器处于标准模式。

你需要做两件事:

  1. 确保你有一个有效的文档类型,这样你就可以避免 Quirks 模式。如果您没有,请添加<!DOCTYPE html>到代码的最顶部(<html>标签上方)。

  2. 在元素中的某处添加 IE 标准模式元标记<head>

    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    

    这将迫使 IE 使用它可用的最佳模式——因此 IE9 将处于 IE9 标准模式等。

您应该确保以上两项都在您网站的所有页面中。

[编辑]
您提到您依赖于仅在兼容模式下工作的旧组件。

基本答案是您将无法querySelectorAll在您陷入兼容模式的同一站点中使用。您还会错过许多其他现代浏览器功能。

如果可能,您应该尝试升级该组件,或将其修复为在现代标准模式下工作。

如果您真的无法退出兼容模式,那么您几乎陷入困境。

在这种情况下,您唯一真正的选择是切换到使用像 jQuery 这样的内置了自己的选择器引擎的库。

如果您已经在不使用 jQuery 的情况下编写了您的网站,那么必须重写所有内容才能使用它是一个非常丑陋的想法,但这可能是您唯一的选择。

于 2013-08-23T14:02:47.887 回答
2

好吧,经过一番搜索,我最终使用了这个:

if( navigator.userAgent.indexOf("MSIE") != -1 ) {                    
   controls = document.getElementsByTagName('input');
}else{    
   controls = document.querySelectorAll("input,textarea,button");
}

有用。我会做更多的测试,希望它能工作xD。

于 2013-08-23T14:31:03.070 回答
0

根据MDN

还有一种与 Internet Explorer 兼容的方式来使用 Array.prototype.forEach 进行迭代:

const list = document.querySelectorAll('input[type=checkbox]');
Array.prototype.forEach.call(list, function (checkbox) {
  checkbox.checked = true;
}); 

这是你想做的吗?

于 2020-06-07T13:32:53.763 回答