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

标签 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”,有时它不显示任何内容。我发现这取决于计算机的速度。如果您使用的是快速计算机,它通常可以工作,但在慢速计算机上,大约有三分之二会失败。

当我查看调试控制台时,症状是 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. 按 Enter 键。

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

最佳答案

我不知道 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 脚本中实现相同的保护措施。

关于jquery - 在 IE9 中访问 navigator.userAgent 时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13378985/

相关文章:

Jquery - 在悬停时添加类

javascript - IE 屏蔽我的 C 盘上的 activex 内容有什么意义?

javascript - 从 IE9 拖放事件获取文件位置

javascript - 将容器扩展到缺少 1% 的内容

javascript - 有没有办法从 iframe 内部的元素访问 iframe 外部的 Dom?

jquery 选择(每个)所有选中的复选框?

jquery - 如何使用jquery将行移动到最顶部或底部

jquery - 如何在 Drupal 页面中实现 jQuery 代码(对于非编码人员)

html - 如何在IE9中访问Event.target?

javascript - IE9 中输入按钮单击不是通过 JavaScript 调用的