我有一个令人费解的问题:这个看似简单的页面在 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/ 获取。)
复制方式:
- 打开页面。
- 按 F5。
- 将光标置于地址栏中。
- 按 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/