【问题标题】:IE testing Javascript "Browser Mode" "Document Mode" Driving me NUTZ! Is it a browser compatibility issue or what is going onIE 测试 Javascript “浏览器模式” “文档模式” 让我发疯!是浏览器兼容性问题还是发生了什么
【发布时间】:2012-12-07 22:02:16
【问题描述】:

这里需要干预,因为我对这个 0_o 几乎失去了理智

我正在使用 IE 9 并且正在使用 IE 的 F12 开发工具,试图测试 IE8。 我正在使用 JavaScript 执行一项非常简单的任务。

我正在抓取一些内部 html - 出于任何原因将其用作刺痛。

像这样:

<div id="Some_Container_div">

    <div class="Some_Inner_Div_Class">sometext</div>
    <div class="Some_Inner_Div_Class">sometext</div>
    <div class="Some_Inner_Div_Class">sometext</div>

</div>


<script>

var Div_Contaiers_Inner_Html_As_String = document.getElementById('Some_Container_div').innerHTML;

alert(Div_Contaiers_Inner_Html_As_String);

Array_Of_Divs = Div_Contaiers_Inner_Html_As_String.split("</div>");

alert(Array_Of_Divs);

</script>

上面的代码正确警告: 第一:

<div class="Some_Inner_Div_Class">sometext</div><div class="Some_Inner_Div_Class">sometext</div><div class="Some_Inner_Div_Class">sometext</div>

然后第二个提醒正确的数组:

<div class="Some_Inner_Div_Class">sometext,<div class="Some_Inner_Div_Class">sometext,<div class="Some_Inner_Div_Class">sometext,


如果我现在使用开发人员工具 (f12) 并切换到“浏览器模式”IE8,并且我将“文档模式”也切换到 IE8,浏览器现在会发出警报:

第一:

<DIV class=Some_Inner_Div_Class>sometext</DIV><DIV class=Some_Inner_Div_Class>sometext</DIV><DIV class=Some_Inner_Div_Class>sometext</DIV>
  • 现在注意到缺少的引号了吗?
  • 现在注意到“DIV”这个词的大写了吗?

接下来它会提醒同样的事情:

<DIV class=Some_Inner_Div_Class>sometext</DIV><DIV class=Some_Inner_Div_Class>sometext</DIV><DIV class=Some_Inner_Div_Class>sometext</DIV>

所以看起来它现在甚至没有将字符串拆分成一个数组 - 不知道为什么,就像它不再是一个字符串一样。

如果我现在使用开发人员工具 (f12) 并保持“浏览器模式”IE8 并将“文档模式”也切换到 IE9 - 它再次正常工作....

非常感谢比尔盖茨再次让我感到困惑 0_O

无论如何-所以我在这里寻求帮助-我看到有人说您应该在使用开发人员工具进行测试时将“浏览器模式”切换到 IE8 和“文档模式”也切换到 IE8 -但我没有看到解释我明白为什么。如果你只切换一个或两个有什么区别。

同时:

  • 谁能告诉我这是否能在 IE8 中正常工作?
  • 为什么要去掉引号?
  • 为什么在开发者工具测试模式下不创建数组?

谢谢大家:)

【问题讨论】:

    标签: javascript internet-explorer-8 internet-explorer-9 ie-developer-tools


    【解决方案1】:

    简答:

    这是一个兼容性问题。 JScript 5 引擎 (IE7/IE8) 存在严重缺陷,这是它所做的事情之一(从属性中去除 "s 并在生成 innerHTML 字符串时更改大小写)。同样,由于innerHTML 使用大写字母,它会尝试将您的.split("&lt;/div&gt;"); 与包含&lt;/DIV&gt; 的字符串匹配并且失败。

    尝试改用.split(/&lt;\/div&gt;/i);。这不会解决您的属性中"s 的丢失,但它是部分修复。 See this answer 用于在需要引号时修复丢失的引号和大写的函数。


    关于如何针对旧版本的 IE 进行测试的更大问题:

    本质上,浏览器模式对 Internet Explorer 如何呈现页面1没有任何作用。浏览器模式会影响 IE 如何获取页面,从而更改发送到服务器的 UserAgent。

    文档模式改变了version of the Trident rendering engine,以及是否使用IE9 Chakra Javascript engine or the IE8/IE7 variants of the JScript engine

    TL;DR,出于测试目的,您应该将浏览器模式更改为 IE8,然后观察文档模式是否默认为 IE8 标准或 Quirks。如果代码不起作用,请在两者之间切换。如果代码随后有效,请确保您为任何有效的模式设置了适当的 DOCTYPE (Transitional for Quirks mode, Strict for Standards mode)。

    [1] 浏览器模式也会影响浏览器如何解释条件 cmets,以及 default 文档模式(使其与浏览器模式匹配),因此仅更改这是一个很好的方法弄清楚 IE8 将如何解释页面......但是如果你有 X-UA 兼容的元标记,这种行为会很快中断,所以如果你正在使用这些,只需将文档模式设置为匹配。

    【讨论】:

    • 非常感谢 - 另外: var Div_Contaiers_Inner_Html_As_String = document.getElementById('Some_Container_div').innerHTML.toLowerCase();也立即导致 split() 函数工作 - 保留引号没有简单的答案吗?
    • 会以字符串形式访问子节点来逃避引号问题吗?甚至不确定这是否可能。
    • 嗯。你激发了我的好奇心。稍后回来!
    • 简而言之,不。没有简单的答案。 IE8 对 Element 对象的实现很可悲。无法构建字符串 tagNameattributes[i].name/.value 因为 attributes 数组的长度计算每个属性,而不仅仅是 HTML 设置的那些......无法过滤掉“默认”属性值没有将复杂性增加到可怕的程度......这是一团糟。
    • 我想说stackoverflow.com/questions/1231770/… 可能是您可以用来实现所需效果的最简单的函数。 ://
    【解决方案2】:

    遗憾的是,“IE8 浏览器模式”和 IE8 是完全不同的东西:/

    我认为这段代码在 IE8 中可以正常工作。

    顺便说一句,您可以使用免费的IETester 工具,这比“浏览器模式”要好得多。

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2014-09-12
      • 1970-01-01
      • 2012-08-24
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多