none
javascriptのwindow.open/closeでのIE起動エラー (IE8/Vista) RRS feed

  • 質問

  • 一度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();
    }

    2010年2月22日 18:10

回答

  • そもそもご自身の元のコードの意味を理解してます?

    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
    2010年2月27日 12:00

すべての返信

  • 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
    • 回答としてマーク masakiy 2010年2月23日 17:11
    • 回答としてマークされていない masakiy 2010年2月26日 12:39
    2010年2月23日 9:50
  • 返答ありがとうございます。
    追加質問させてください。

    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の対象になることはない、と理解したのですが、それは正しいでしょうか?
    2010年2月26日 12:38
  • そもそもご自身の元のコードの意味を理解してます?

    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
    2010年2月27日 12:00