2009-07-12 4 views
2

私はちょうど私が持っている問題に助けられましたhereオンロードが何回トリガーされましたか?

var win = window.open(url, name); 
win.onunload = StartLoad; 
win.close(); 

ONUNLOADが一度トリガされるか、毎回イベントが発生した場合、私は知りたいと思った、この問題を完全に解決するには?

つまり、私の関数startLoadは、子ウィンドウ "win"がリダイレクト、クローズされるたびに実行されますか?それとも、このイベントを一度やりますか?

謝罪、これは愚かな質問である場合。

おかげで、すべての

答えて

3

いいえ - このメソッドは、IE6とIE7のページを移動するときに複数回起動できます。

このコードスニペットは、この(OnUnloadTest.htmとして保存)を示しています。

<body> 
    <form id="form" action="OnUnloadTest.htm" method="post"> 
     Click <a href="javascript:form.submit()">here</a> 
    </form> 
    <script type="text/javascript"> 
     window.onbeforeunload = beforeunload 
     function beforeunload() { 
      alert('OnUnload'); 
     } 
    </script> 
</body> 

基本的には、イベントの実際のアンカーをクリックするために、一度火災、一度ページなどが実際に戻ってポストを。私はあなたがアンカーのhrefにjavascriptを持っているときにのみこの問題を見てきましたが、ASP.NET linkbuttonsを使用すると警告が表示されますが、これはhrefにjavascriptを入れているためです。

他のほとんどの種類のナビゲーション(ユーザーが通常のアンカーをクリックする、ブラウザを閉じる、ブックマークで移動するなど)では、イベントは1回だけ発生します。

+1

「アンロード」イベントではなく、「beforeunload」イベントではありませんでしたか? – kangax

1

それだけ、一度ウィンドウがアンロード初めてを起動する必要があります。それ以外はセキュリティホールになるでしょう。

0

最新のブラウザのページキャッシュ機能でアンロードイベントがどのように再生されるかについての興味深い議論については、WebKit Page Cache II – The unload Eventをお読みください。

1

イベントハンドラが一度しか実行されないようにするには、ハンドラが呼び出されたときにハンドラのバインドを解除することができます。これは、コールバックを複数回実行されないことを保証します:

var win = window.open(url, name); 
win.onunload = function(event) { 
    win.onunload = function() {}; // assign a noop 
    return Startload.call(this, event); 
}; 
win.close(); 

いくつかのJavaScriptライブラリを使用すると、一度だけ実行するイベントハンドラをバインドするための組み込みのヘルパーを持っています。たとえば、jQueryにはこの目的のためのone()メソッドがあります。

var win = window.open(url, name); 
$(win).one('unload', Startload); 
win.close(); 
関連する問題