2009-07-10 15 views
9

私は以前この質問をしていましたが、問題は半分で解決されました.Javascriptには厳しいセキュリティがあることがわかりました。子ウィンドウが閉じるときに親ウィンドウの機能を実行するには?

私が学んだこと:親ウィンドウは子ウィンドウを開きます。子ウィンドウは別のドメインにリダイレクトされ、リダイレクトされます。親ウィンドウを閉じたときに親ウィンドウの機能を起動しようとします。

window.opener.startLoad(); 

これは許可(セキュリティ)の問題につながり、動作しません。

(半分)新しい問題:子ウィンドウを開くウィンドウを取得するにはどうしたら、親ウィンドウで関数を実行すると閉じますか?

これは非常に効率的なやり方が必要です。

ありがとうございました。

+0

私の答えに関する最新のコメントに応じて、私はウィンドウが閉じたときにその関数を呼び出さない理由を考えることができません。ウィンドウを開いた場所にコードを投稿し、終了時に呼び出す関数を投稿できますか?私はもっ​​とあなたを助けることができるかもしれませんが、今はアイデアがありません。 – Sean

答えて

19

これを試してみてください:

var win = window.open(url, name); 
win.onunload = afterChildClose; // afterChildClose() is the function. 
win.close(); // afterChildClose() should fire now. 

すべてこのコードは(afterChildClose()を含む)親ウィンドウのJavaScriptに位置し、実行されます。ウィンドウを作成してアンロードイベントに関数を割り当てています。

ああ、ちょうど私が考えたこと。子ウィンドウが更新されたり、別のURLにナビゲートされたりすると、onunloadイベントも発生します。ウィンドウが閉じられたときだけイベントが発生するようにするには、win.closedのafterChildClose()にチェックを入れる必要があります。

EDIT:これを試すためにまとめた2つのサンプルページのコードを示します。

親ウィンドウ:

<html> 
<body> 
<script type="text/javascript"> 
    var win = window.open("secondwindow.html", "woo"); 
    win.onunload =onun; 

    function onun() { 
     if(win.location != "about:blank") // This is so that the function 
              // doesn't do anything when the 
              // window is first opened. 
     { 
      alert("closed"); 
     } 
    } 
</script> 
</body> 
</html> 

子ウィンドウ( "secondwindow.html"):

<html> 
<body> 
<script type="text/javascript"> 
    setTimeout('window.close();', 5000); 
</script> 
</body> 
</html> 

私はFirefoxで最初の文書を開くしようとすると、それはウィンドウを開き、ウィンドウは5を待ちます最初の文書にalert()が表示されるので、サブウィンドウが閉じても機能しています。

+0

afterChildClose関数はどこにありますか? – Abs

+0

親ウィンドウから子ウィンドウを閉じるのですか? – Abs

+0

はい、 'win.close()'は、子ウィンドウが閉じられたときに何が起こるかを示すためのものです。私の答えのコードはあなたの完全な解決策ではなく、単にあなたが必要とすることをするためのテクニックを示しています。この手法は、子ウィンドウオブジェクトを開いた後にその子ウィンドウオブジェクトをキャプチャし、そのオブジェクト(onunloadなど)にイベントを割り当てます。 – Sean

2

私はここに来て、同様の機能を探していましたが、クロスブラウザとの互換性を保って動作させることはできませんでした。そこでここでは子ウィンドウが閉じるようなコードを実行するための別の方法は次のとおりです。

var win = window.open("http://www.google.com"); 

var winClosed = setInterval(function() { 

    if (win.closed) { 
     clearInterval(winClosed); 
     location.assign("http://www.bing.com/"); //Execute your code here 
    } 

}, 250); 

それは子ウィンドウから任意のイベントハンドラを使用していない、それは子ウィンドウの内容を変更する必要はありません。

関連する問題