インターネットサイト○○を開けません。
割と有名なIEの不具合。(7でも健在)
body直下以外のbody内のノードで、appendChildを使うと、「インターネットサイト○○を開けません。操作は中断されました。」というダイアログが表示され、OKを押すとエラーページになる
原因は、ロードのタイミングとのこと。
問題
これに関連した問題で、ちょっと気づきにくいのが、こんなかんじの。
sample1.html
<?xml version="1.0" encoding="UTF-8"?> <!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> <script src="/prototype.js" type="text/javascript"></script> <script src="/sample.js" type="text/javascript"></script> <body> <div> <a href="sample2.html"><img src="sample1.jpg" onmouseover="popUpOn(event, 'サンプル1')" onmouseover="popUpOff()" /></a> </div> </body> </html>
sample2.html
<?xml version="1.0" encoding="UTF-8"?> <!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> <script src="/prototype.js" type="text/javascript"></script> <script src="/sample.js" type="text/javascript"></script> <body> <div> <a href="sample1.html"><img src="sample2.jpg" onmouseover="popUpOn(event, 'サンプル2')" onmouseover="popUpOff()" /></a> </div> </body> </html>
application.js
function popUpOn(event, PopMsg) { popUpOff(); var x,y; var msgX=+10,msgY=-30; x=getMouseX(event); y=getMouseY(event); var div = document.createElement("div"); div.setAttribute("id","pop_up"); div.style.position = 'absolute'; div.style.left = x+msgX+'px'; div.style.top = y+msgY+'px'; div.innerHTML = PopMsg; document.body.appendChild(div); } function popUpOff() { var div = $('pop_up'); if(div != null){ Element.remove("pop_up"); } } // 省略
「body直下以外のbody内ノードの、onmouseover等で、要素を生成する関数等を呼び出した」場合も、タイミングによってはエラーとなります。
具体的には、この例で、sample1.htmlの画像をクリックしたとき、sample2.htmlが読み込まれますが、その時点でマウスカーソルがsample2.htmlの画像の上にあるため、onmouseoverイベントが実行されます。このとき、エラーが発生する”ことがあります”。
この例は極端ですが、たとえば、検索結果を表にして表示し、各項目にポップアップで説明文を表示、リンクでその値で絞込み検索を行う、といったWebアプリケーションでは割と起こり得ます。
回避
要は、ページがロードされるまで、要素を生成する操作をしないようにすればよいわけです。
Javascriptに変更を加えない方法では、以下のような感じで一応は回避できます。
sample1.html
<?xml version="1.0" encoding="UTF-8"?> <!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> <script src="/prototype.js" type="text/javascript"></script> <script language="javascript"> var applicationScriptLoader = function() { var s = document.body.appendChild(document.createElement("script")); s.setAttribute('id', 'application_script_tag') s.type = "text/javascript"; s.src = "/sample.js"; }; Event.observe(window, 'load', applicationScriptLoader, false); </script> <body> <div> <a href="sample2.html"><img src="sample1.jpg" onmouseover="popUpOn(event, 'サンプル1')" onmouseover="popUpOff()" /></a> </div> </body> </html>
ページのロードが完了してから、要素を生成する関数が定義されているスクリプトを読み込みます。
完了するまでにonmouseoverイベントが発生した場合、エラーとなりますが、エラー画面になるよりましです。