在IE9中访问navigator.userAgent时权限被拒绝

时间:2012-11-14 12:39:18

标签: jquery internet-explorer-9

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

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

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

浏览器(在日志中)写入它从quirks模式切换到IE9模式。我的假设是在浏览器切换到IE9模式之前加载了jQuery,导致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. 按enter键。
  5. 根据需要重复步骤2-4。问题可能是因为没有等待加载DOM(如http://bugs.jquery.com/ticket/12282中所述)。

3 个答案:

答案 0 :(得分:2)

我不知道1.9但我在IE9上的回归率为1.8(回归超过1.7)。这里详细描述了这个错误:

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

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

显然,关于这是一个怎样的错误实际上存在争议。

无论如何,更新到1.8.2解决了我的问题。我希望你能为1.9分支提供相同的修复,如果它真的是你遇到的同一个bug。

另一种解决方案是在html所需的一切之后,尽可能简单地将document.ready部分移动到页面的末尾(当然,在简化的示例中,它将无效,因为您使用{{ 1}},但希望在你真正的代码中你不需要它。)

或者,如果你想弄清楚并且在1.9中没有修复它,那么这里已经为1.8实现了修复:

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

正如您所看到的,它只是一行代码,因此您可以维护自己的1.9版本的固定版本,直到有稳定版本,或者您可以在自己的jquery脚本中实现相同的安全措施。

答案 1 :(得分:2)

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

感谢所有人的帮助。

有关政策见下图。

enter image description here

答案 2 :(得分:1)

只是一个建议,您是否尝试从同一内容传送网络下载这两个脚本?并且只是确保订单是正确的(您的看起来是正确的)但也可能是由于来自一个来源的延迟或者其他。旁注:尝试将脚本标记放在文档的底部,而不是标题,这是由于性能问题。