最近変更したWebページがあり、IE7を除くすべてのブラウザーで正常に機能します。IE7では、次のように表示されます。
SCRIPT1014:無効な文字blah.html、1行目の文字1
スクリーンショット:
コードを数回確認しましたが、何も目立ちません。javascriptエラーは知っていますが、どこにあるのか特定できません。
イライラする部分は、どこを見ればよいかわからず(1行目1文字目)、エラーがあいまいです。
最近変更したWebページがあり、IE7を除くすべてのブラウザーで正常に機能します。IE7では、次のように表示されます。
SCRIPT1014:無効な文字blah.html、1行目の文字1
スクリーンショット:
コードを数回確認しましたが、何も目立ちません。javascriptエラーは知っていますが、どこにあるのか特定できません。
イライラする部分は、どこを見ればよいかわからず(1行目1文字目)、エラーがあいまいです。
問題は、への呼び出しの文字列内のjavascriptエラーでしたwindow.setTimeout
。
の文字列window.setTimeout([string], [int])
はevalとして実行されるため、実行中にjavascriptエラーが発生しました。これは、私にとってはウィンドウのonloadイベント中に発生しました。
エラーに「無効な文字」と表示されたのはなぜですか?
jqueryコマンドを開始するためにaの#
代わりに使用したためです。$
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コマンドの#
代わりに誤って使用しました。これは実際にはレガシーコードであるため、文字列( evil)$
でevalを呼び出すのではなく、特定の関数を呼び出すようにリファクタリングしたため、次のようになりました。
window.setTimeout(function(){
$('#sdfl');
}, 1000);
この変更により、評価文字列ではなくページに関連する特定の行と文字番号が指定されるため、元のエラーを見つけるのがはるかに簡単になることに注意してください。