我有一个我最近更改的网页,它在除 IE7 之外的所有浏览器上都运行良好。在 IE7 上,我看到以下内容:
SCRIPT1014:无效字符 blah.html,第 1 行字符 1
截屏:
我已经多次审查了代码,没有任何突出之处。我知道它是一个 javascript 错误,但我无法确定在哪里。
令人沮丧的部分是不知道在哪里看(第 1 行字符 1)并且错误很模糊。
我有一个我最近更改的网页,它在除 IE7 之外的所有浏览器上都运行良好。在 IE7 上,我看到以下内容:
SCRIPT1014:无效字符 blah.html,第 1 行字符 1
截屏:
我已经多次审查了代码,没有任何突出之处。我知道它是一个 javascript 错误,但我无法确定在哪里。
令人沮丧的部分是不知道在哪里看(第 1 行字符 1)并且错误很模糊。
问题是调用window.setTimeout
.
in 中的字符串window.setTimeout([string], [int])
作为 eval 执行,因此在执行期间导致了 javascript 错误,对我来说恰好是在 window onload 事件期间。
为什么错误说“无效字符”?
因为我使用 a#
而不是 a$
来启动 jquery 命令。javascript 编译器不知道该怎么做,#
所以它抛出了一个错误。
为什么错误报告在第 1 行字符 1 上?
由于中的字符串window.setTimeout
是作为 eval 执行的,所以在第 1 行字符 1 上报告了错误——这终于有意义了!
用于复制问题的示例 html
这是我创建的一个示例页面,用于演示该问题:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Page</title>
<script src="http://code.jquery.com/jquery-1.9.0.min.js"></script>
</head>
<body>
<h1>Test Page</h1>
<script type="text/javascript">
$(document).ready(function(){
window.setTimeout("#('#sdfl');", 1000);
});
</script>
</body>
</html>
我不小心在 eval 字符串中为 jquery 命令使用了 a#
而不是 a 。$
这实际上是遗留代码,所以我将它重构为调用特定函数而不是在字符串 ( evil ) 上调用 eval 所以它现在看起来更像:
window.setTimeout(function(){
$('#sdfl');
}, 1000);
请注意,通过此更改,查找原始错误会容易得多,因为它会给出与页面相关的特定行和字符编号,而不是 eval 字符串。