トップ回答者
javascriptのwindow.open/closeでのIE起動エラー (IE8/Vista)

質問
-
一度window.openで開いた新規ウインドウをwindow.closeで閉じ、再度window.openで新規ウインドウを立ち上げています。
IE6以前のころは問題なかったのですが、このソースをIE8上で動かすと、再度新規タブ/ウインドウを生成するところで、javascriptのエラーが発生し、新規タブ/ウインドウが生成されないことがあります。
javascriptをデバッグすると、window.closeのところで、windowオブジェクトがnullになってしまい、エラーにつながるようなのですが、なぜnullになってしまうのかはわかりません。
OSはVista/Windows7のときに問題が発生し、Windows XPのときは発生しません。
この問題の原因として、何が考えられ、どのような回避策をとればよいでしょうか?
HTML/Javascriptソースを以下に添付します。
[HTML]
<html>
<head>
<script language="JavaScript" src="./Win_Open.js">
</script>
</head>
<body onload="Win_Open()">
window.openテストモジュール
</body>
</html>
[JavaScript]
(Win_Open.js)
function Win_Open(){
Win = window.open("","Win","location=no,resizable=yes,width=390,height=750,scrollbars=yes,top=0,left=0");
// Windows版のみ
if (navigator.platform.substring(0,3) == "Win")
{
Win.close();
Win = window.open("","Win","location=no,resizable=yes,width=390,height=750,scrollbars=yes,top=0,left=0");
}Win.document.open("text/html");
Win.document.write("<HTML>\n");
Win.document.write("<BODY>\n");
Win.document.write("test\n");
Win.document.write("</BODY>\n");
Win.document.write("</HTML>\n");
Win.document.close();
}
回答
-
そもそもご自身の元のコードの意味を理解してます?
set w1=open("","aaa")
set w2=open("","bbb")
msgbox (w1 is w2)
のように名前が違えば新規にWindowを開くが、
set w1=open("","aaa")
set w2=open("","aaa")
msgbox (w1 is w2)
のように同じ名前があると新規に開かない。
なので既存のWindowを閉じようとした。
set w1=open("","aaa")
w1.close
set w2=open("","aaa")
msgbox (w1 is w2)
が、closeが非同期なので閉じるのが遅延し、同じ名前がまだあった。
そこで、
set w1=open("","aaa")
w1.name="bbb"
set w2=open("","aaa")
msgbox (w1 is w2)
のように既存のWindowの名前を変えれば大丈夫。- 回答としてマーク masakiy 2010年3月3日 17:07
すべての返信
-
window.open()やwindow.close()は非同期です。
http://scripting.cocolog-nifty.com/blog/2009/08/windowopenwindo.html
同じ名前のウィンドウを(もしあれば)閉じて、常に新しく開く。
http://scripting.cocolog-nifty.com/blog/2009/08/post-ac20.html -
返答ありがとうございます。
追加質問させてください。
set win=open("about:blank","hoge","resizable=no")
win.name=""
win.close
set win=open("about:blank","hoge","resizable=no")
のようにすれば、2行目のwin.nameでリネームしているため、win.closeで閉じられる対象は1行目でオープンしているウインドウであり、
4行目でオープンされているウインドウはnameが違うため("hoge")、
win.closeの対象になることはない、と理解したのですが、それは正しいでしょうか? -
そもそもご自身の元のコードの意味を理解してます?
set w1=open("","aaa")
set w2=open("","bbb")
msgbox (w1 is w2)
のように名前が違えば新規にWindowを開くが、
set w1=open("","aaa")
set w2=open("","aaa")
msgbox (w1 is w2)
のように同じ名前があると新規に開かない。
なので既存のWindowを閉じようとした。
set w1=open("","aaa")
w1.close
set w2=open("","aaa")
msgbox (w1 is w2)
が、closeが非同期なので閉じるのが遅延し、同じ名前がまだあった。
そこで、
set w1=open("","aaa")
w1.name="bbb"
set w2=open("","aaa")
msgbox (w1 is w2)
のように既存のWindowの名前を変えれば大丈夫。- 回答としてマーク masakiy 2010年3月3日 17:07