IEで「操作は中断されました」の罠にはまる¶
JavaScriptで include('foo.js')
とか書ける様になる include.js というのがあります。
やってることは非同期に指定されたファイルを読み込んでHTMLにscriptエレメントを挿入しているだけなんで、単純な用途なら自分で作ってもいいかな、という感じですが、とりあえず使ってみました。
初めのうちは特に問題もなく、Zopeで表示するページに組み込んで使っていたのですが、IE6で動作確認したところ、思わぬ問題が。includeを使うとIE6で 「操作は中断されました」
というDLGが出てページが表示されません。色々コードをいじったりググったりして、あるていどの発生条件が分かった気がします。
HTMLのロードがまだ完了していないときに
動的にHTMLを変更する(include.jsでincludeを実行する等)
<head>タグの最初にbaseタグがZopeによって挿入されている
baseタグの挿入により、meta contentTypeタグが<head>直後ではなくなる
Zopeでは例えばフォルダのURLで末尾に'/'を付けていない場合などにZope的に正しいURLをbaseタグとしてZPTのレンダリング結果に挿入します。Zope的に正しいURLにアクセスするとbaseタグは挿入されません。今回の現象はbaseタグが挿入されていない場合には発生しなかったので、(3)を条件に入れています。
<head>
<base href="http://www.example.com/index.html" />
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8"/>
<script type="text/javascript"
src="/js/include.js"></script>
....
</head>
(4)はどこかのサイトで見かけた情報なので条件に入れてますが、もしかしたら違うかも。
今回は、(1)の条件を無くすために、HTMLロード終了付近(</body>直前)でincludeすることにより回避。onloadハンドリングでなくてもいちおう大丈夫みたい。
....
<script type="text/javascript">include('/js/foo.js');</script>
</body>
もう深夜2:30か...。IE6はとっとと無くなってくれ。