我有一个令人费解的问题:这个看似简单的页面在 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/获得。)
通过以下方式复制它:
- 打开页面。
- 按 F5。
- 将光标放在地址栏中。
- 按回车。
根据需要重复步骤 2-4。问题是否可能是由于不等待 DOM 加载(如http://bugs.jquery.com/ticket/12282中所述)。