プロが教えるわが家の防犯対策術!

onbeforeunload時のwindow.openが効かないのですが…
ページ内に設置した「閉じる」ボタン、またはブラウザの「閉じる」を押したときに、
新規ウィンドウが立ち上がるようにしたいのです。
複数台でテストすると、半数が新規ウィンドウが立ち上がりません。

まずIEでunloadが効かない場合がある事から、
以下サイトよりonbeforeunloadのスクリプトを引っ張りました。
http://blog.moxiecode.com/2008/04/08/unload-even …

で、
<SCRIPT LANGUAGE="JavaScript">
~上部省略~
function unload() {
//alert('Unload event occured.');
window.open('test_b.php');
};
</script>
<body onbeforeunload="unload()">

と記述したのですが、
前述で新規ウィンドウが立ち上がらなかった台が、
アラートだと出すのですが、window.openに反応しません。

何か解決方法はありますでしょうか。
javascriptに関して全くの初心者ですので、四苦八苦しながらテストしています。
もし解決方法をご存じの方はソース例を教えて頂くと大変助かります。

宜しくお願いします!

A 回答 (3件)

onbeforeunloadを知らなかったので調べてみました。


return で適当な文字列を返す必要があるようですね。

onBeforeUnload の挙動について: 脳外記憶装置
http://konnichiwa-dou.cocolog-nifty.com/blog/200 …
IEでのonBeforeUnload の挙動 | Inside ASCADE
http://inside.ascade.co.jp/node/58#

window.onbeforeunload でも良さそう。
ただ、確認ダイアログが出る前に windowopen() が発動するので、キャンセルを押し続けるとウインドウが増殖します。

window.onbeforeunload = function(){
 window.open('test3.html');
 return 'sample';
}

あと、(on)beforeunload は少なくともDOM-level2で定義されていないので、ブラウザによっては動かないと思います。(Fx3.6では動作しました)
http://www.y-adagio.com/public/standards/tr_dom2 …
    • good
    • 0
この回答へのお礼

ありがとうございます!
window.onbeforeunloadで
新規ウィンドウが立ち上がらなかった台でも
動作しました!
希望していた仕様から考えると、問題がないのでひとまずこちらでいこうと思います。^^
質問からすぐに回答頂きましてありがとうございます!

お礼日時:2010/04/23 20:04

#1,2 です。


何度も済みません。

> まずIEでunloadが効かない場合がある事から、
ちょっと気になったのですが、IEでunloadが効かないというのはどのような状況でしょうか?

<script type="text/javascript">
window./*@cc_on @if(@_jscript) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'unload', function (Event) {
 alert('unloadします');
}, false);
</script>

上はIE8で動作しています。
実際のソースを見れば、修正点がわかるかもしれません。

あと、今更ではありますが、unload も beforeunload も

・リンクをクリックする
・ページを更新する

というイベントでも発動する点に留意しておいてください。
更新する度に、window.open() が発生すると迷惑スクリプトと受け止められるかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます!上記ソースも試してみます^^

>上はIE8で動作しています。
>実際のソースを見れば、修正点がわかるかもしれません。

01.function fixUnload() {
02. // Is there things still loading, then fake the unload event
03. if (document.readyState == 'interactive') {
04. function stop() {
05. // Prevent memory leak
06. document.detachEvent('onstop', stop);
07.
08. // Call unload handler
09. unload();
10. };
11.
12. // Fire unload when the currently loading page is stopped
13. document.attachEvent('onstop', stop);
14.
15. // Remove onstop listener after a while to prevent the unload function
16. // to execute if the user presses cancel in an onbeforeunload
17. // confirm dialog and then presses the stop button in the browser
18. window.setTimeout(function() {
19. document.detachEvent('onstop', stop);
20. }, 0);
21. }
22.};
23.
24.function unload() {
25. alert('Unload event occured.');
26.};
27.
28.window.attachEvent('onunload', unload);
29.window.attachEvent('onbeforeunload', fixUnload);

上記ソースでアラート部分をwindow.openにし、
bodyでonbeforeunload="unload()"と呼び出しました。

上記の場合IE6,7,8で動作する台としない台があり、
ブラウザのバージョンで動かない、という感じではなかったので
困っていた次第です。

>更新する度に、window.open() が発生すると迷惑スクリプトと受け止められるかもしれません。

ありがとうございます。
また、更新するような内容のページではなく、一度しか通らない画面ではあるので、
問題はないと想定しておりますが、今後注意しておきます。

お礼日時:2010/04/23 20:12

#1です。



DOM level3でも unloadbefore は定義されていないようですね。

Document Object Model (DOM) Level 3 Events Specification
http://www.w3.org/TR/DOM-Level-3-Events/

あと、beforeunloadについて別にやり方で実装している方もいらっしゃいました。(やってることは同じなんですけどね)

----------
<script type="text/javascript">
window.onbeforeunload = function(event){
 event = event || window.event;
 return event.returnValue = '移動しようとしてるよ!';
}
</script>

自分自身をロードするときにフレーム解除してロードしようとするサイトをフレームで開くときの抑制方法 - blog.katsuma.tv
http://blog.katsuma.tv/2008/12/beforeunload_hand …
----------

応用すると、イベントリスナでも実装できるようです。(IE8, Fx3.6で確認)

<script type="text/javascript">
window./*@cc_on @if(@_jscript) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'beforeunload', function (Event) {
 Event.returnValue = '遷移しますか?';
}, false);
</script>

javascript:ページ遷移時に確認を出して、キャンセルしたら、遷移しないということをしたいと考えています。 window.addEventListener('beforeunload', function(){ if (ex.. - 人力検索はてな
http://q.hatena.ne.jp/1168612418
    • good
    • 0
この回答へのお礼

検証して頂きましてありがとうございます。
折角なのでいろいろちょっと時間作って試してみます^^

お礼日時:2010/04/23 20:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています