querySelectorAll替代IE

时间:2013-08-23 13:40:45

标签: javascript internet-explorer-9

我正在运行一些使用此功能的javascript:

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

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

还有其他选择吗?

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

3 个答案:

答案 0 :(得分:9)

querySelectorAll在IE9中运行正常。它甚至适用于IE8。

但听起来你的问题是让它专门用于怪异模式或兼容模式。

如果那是问题那么......好吧,问题是模式,而不是功能。您需要将网站置于标准模式,然后querySelectorAll才能正常工作。

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

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

显而易见的答案是:重新打开功能。

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

你需要做两件事:

  1. 确保您拥有有效的doctype,这样您就可以避免使用Quirks模式。如果您没有,请将<!DOCTYPE html>添加到代码的最顶部(<html>标记上方)。

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

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

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

  3. 您应该确保上述所有内容都在您网站的所有页面中。

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

    基本答案是,您无法在遇到兼容模式的同一网站中使用querySelectorAll。还有许多其他现代浏览器功能,你也会错过。

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

    如果真的无法退出兼容模式,那么你就会陷入困境。

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

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

答案 1 :(得分:2)

嗯,经过一些搜索,我最终使用了这个:

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

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

答案 2 :(得分:0)

根据MDN

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

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

您是要这样做吗?