【问题标题】:Permission denied when accessing navigator.userAgent in IE9在 IE9 中访问 navigator.userAgent 时权限被拒绝
【发布时间】:2012-11-14 12:39:17
【问题描述】:

我有一个令人费解的问题:这个看似简单的页面在 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 次失败。

当我查看调试控制台时,症状是 jQuery 在尝试访问 navigator.userAgent 时获得权限被拒绝。

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

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

我已经设法省略了 jQuery,并用这个简单的 sn-p 重现了这个问题:

<!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 中所述)。

【问题讨论】:

  • 从顶部删除&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  • ...但是页面应该以&lt;!doctype html&gt; 开头(尝试无济于事)或像这样的XML声明...?
  • 你有没有&lt;!doctype html&gt; 而不是的XML标签?
  • 这是重现问题的简单方法。转到test.m.e17.dk/jquery-not-loading。按 F5。现在在地址栏中选择 url,然后按 enter。按 F5 然后按 Enter 重复将再次重现。 (我修改了示例以使用 &lt;!doctype html&gt; 代替 XML 声明。)请记住,它仅在 IE9 中失效。
  • 不,无法重现。看起来是您自己的浏览器的本地问题。

标签: jquery internet-explorer-9


【解决方案1】:

我不知道 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 的所有内容之后(当然在您的简化示例中它不会工作,因为您使用 @987654323 @,但希望在你的真实代码中你不需要它)。

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

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

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

【讨论】:

  • 感谢分享。我正在调查这个。
【解决方案2】:

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

感谢大家的帮助。

相关政策如下图所示。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的。回归开始的原始代码使用的是 jQuery CDN。
    • 我也将尝试使用 CDN 的示例。
    猜你喜欢
    • 2011-07-18
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2014-11-08
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    相关资源
    最近更新 更多