2

我有一个令人费解的问题:这个看似简单的页面在 IE9 中不起作用:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <!-- jq.js is the non-minified jQuery library -->
    <script type="text/javascript" src="jq.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/ui/1.9.0/jquery-ui.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            $('body').append('<h1>ok</h1>');
        });
    </script>
</head>

<body>
</body>
</html>

我得到的行为是有时页面显示“正常”,有时它不显示任何内容。我发现这取决于计算机的速度。如果您使用的是速度快的计算机,它通常可以工作,但在速度较慢的计算机上,它会失败大约 3 次中的 2 次。

当我查看调试控制台时,症状是 jQuery 在尝试访问navigator.userAgent.

浏览器写入(在日志中)它正在从quirks模式切换到IE9模式。我的假设是 jQuery 在浏览器切换到模式之前被加载IE9,导致 jQuery 被捕获在quirks模式中并且从那里无法访问任何浏览器属性。

我尝试插入<!doctype html>并插入X-UA-Compatible元标记以使 IE9 立即切换到IE9模式,但它没有解决问题。

我设法省略了 jQuery,并用这个简单的代码片段重现了这个问题:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
</head>

<body>
    <script type="text/javascript">
        document.write('<h1>testing</h1>');
        try {
            document.write('<h1>' + navigator.userAgent + '</h1>');
            document.write('<h1>ok</h1>');
        } catch(e) {
            document.write('<h1>not ok</h1>');
        }
    </script>
</body>
</html>

(可在http://test.m.e17.dk/ie9-navigator/获得。)

通过以下方式复制它:

  1. 打开页面。
  2. 按 F5。
  3. 将光标放在地址栏中。
  4. 按回车。

根据需要重复步骤 2-4。问题是否可能是由于不等待 DOM 加载(如http://bugs.jquery.com/ticket/12282中所述)。

4

3 回答 3

2

我不知道 1.9,但我在 IE9 上与 1.8 有类似的回归(超过 1.7 的回归)。该错误在此处详细描述:

http://bugs.jquery.com/ticket/12282

基本上,当在 IE9 中触发 document.ready 时,DOM 可能还没有准备好,因为您的 javascript 脚本可能在读取整个页面之前启动。

显然,实际上存在关于这是否是错误的争论。

无论如何,更新到 1.8.2 解决了我的问题。如果您遇到的错误确实与您遇到的错误相同,我希望您对 1.9 分支也有相同的修复。

另一种解决方案是在页面末尾尽可能简单地移动 document.ready 部分,在您需要从 html 中获取所有内容之后(当然在您的简化示例中它不会工作,因为您使用<body>,但希望在您的真正的代码,你不需要它)。

或者,如果您想弄脏自己的手并且它尚未在 1.9 中修复,那么这里是为 1.8 实施修复的地方:

https://github.com/jquery/jquery/commit/0f553ed0ca0c50c5f66377e9f2c6314f822e8f25

正如你所看到的,它只是一行代码,所以也许你可以维护你自己的 1.9 版本的固定版本,直到有一个稳定的版本,或者你可以在你自己的 jquery 脚本中实现同样的保护。

于 2012-11-14T12:54:49.183 回答
2

我找到了这个错误的原因:它是 Active Directory 中的一个组策略设置导致 IE9 行为不端。我将尝试获取确切的名称并将其添加到此处以供遇到相同问题的任何人使用。

感谢大家帮忙。

有问题的政策在下面的附图中。

在此处输入图像描述

于 2012-11-18T15:16:58.373 回答
1

只是一个建议,您是否尝试过从同一个内容交付网络下载两个脚本?并确保顺序正确(您的似乎正确),但这也可能是由于一个来源或另一个来源的延迟。旁注:尝试将您的脚本标签放在文档的底部,而不是标题,这是由于性能问题。

于 2012-11-14T12:49:25.340 回答