onbeforeunload時のwindow.openが効かないのです

このQ&Aのポイント
  • ページ内に設置した「閉じる」ボタン、またはブラウザの「閉じる」を押したときに、新規ウィンドウが立ち上がるようにしたいのです。
  • IEでunloadが効かない場合があるため、onbeforeunloadのスクリプトを使用しましたが、window.openが反応しません。
  • javascriptに関して初心者であり、解決方法を求めてテストしています。ソース例の提供をお願いします。
回答を見る
  • ベストアンサー

onbeforeunload時のwindow.openが効かないのです

onbeforeunload時のwindow.openが効かないのですが… ページ内に設置した「閉じる」ボタン、またはブラウザの「閉じる」を押したときに、 新規ウィンドウが立ち上がるようにしたいのです。 複数台でテストすると、半数が新規ウィンドウが立ち上がりません。 まずIEでunloadが効かない場合がある事から、 以下サイトよりonbeforeunloadのスクリプトを引っ張りました。 http://blog.moxiecode.com/2008/04/08/unload-event-never-fires-in-ie/ で、 <SCRIPT LANGUAGE="JavaScript"> ~上部省略~ function unload() { //alert('Unload event occured.'); window.open('test_b.php'); }; </script> <body onbeforeunload="unload()"> と記述したのですが、 前述で新規ウィンドウが立ち上がらなかった台が、 アラートだと出すのですが、window.openに反応しません。 何か解決方法はありますでしょうか。 javascriptに関して全くの初心者ですので、四苦八苦しながらテストしています。 もし解決方法をご存じの方はソース例を教えて頂くと大変助かります。 宜しくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.1

onbeforeunloadを知らなかったので調べてみました。 return で適当な文字列を返す必要があるようですね。 onBeforeUnload の挙動について: 脳外記憶装置 http://konnichiwa-dou.cocolog-nifty.com/blog/2006/03/onbeforeunload__b2cc.html 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_events/events.html

z-oggy
質問者

お礼

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

その他の回答 (2)

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

#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() が発生すると迷惑スクリプトと受け止められるかもしれません。

z-oggy
質問者

お礼

ありがとうございます!上記ソースも試してみます^^ >上は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() が発生すると迷惑スクリプトと受け止められるかもしれません。 ありがとうございます。 また、更新するような内容のページではなく、一度しか通らない画面ではあるので、 問題はないと想定しておりますが、今後注意しておきます。

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

#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_handle.html ---------- 応用すると、イベントリスナでも実装できるようです。(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

z-oggy
質問者

お礼

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

関連するQ&A

  • IE7でのwindow.close後のwindow.openについて

    javascriptで、ボタンクリックでウィンドウを開くときに、同じ名前のウィンドウが既に開いていたら一回閉じで、開き直すというロジックを書いてます。 これはIE6では正常に動いているのですが、IE7になると、ウィンドウが閉じたまま、開き直さないで何も表示されなくなってしまいます。たまに開くときもあるのですが。 ボタンクリック後のコードを載せます。 ちゃんと開く方法はないでしょうか? function openwindow(){ var newWindow = window.open("test.html", "test"); if(newWindow.name == "test") { newWindow.close(); } oneScdWindow=window.open("test.html", "test"); }

  • window.open _self でとんでくれない

    初歩的な質問だと思うのですが。 《test1.htmlのソース》 <html> <head> <title>test1</title> </head> <SCRIPT language=JavaScript> <!-- function jump(){ xurl="test2.html"; window.open(xurl,"_self"); } --> </SCRIPT> <body> <form> <input type=submit value="OK" onclick="jump()"> </form> </body> </html> これで[OK]ボタンをクリックしてもtest2.htmlを表示してくれません。 _selfを付けなければ別ウィンドウで表示されるのですが、自身のウィンドウに表示させるにはどうしたらいいのでしょうか。 ブラウザはIE6です。 よろしくお願いいたします。

  • window openについて

    こんにちは、例えば以下のようなスクリプトがあったとします。 <html> <form name = serchform> <input type=text name=id><br> <input type=submit value=ID検索 onclick="openwin()"> <a href="javascript:open(1);"><Img Src="1.bmp"></a><br> <a href="javascript:open(2);"><Img Src="2.bmp"></a><br> <script type="text/javascript"><!-- function openwin() { a = document.serchform.id.value; url = "http://10.8.2.166/test/syuhou_kensaku.php?id="+a; mywin = window.open(url,"","width=1120,height=500"); } function open(select) { if(aa == 1){ alert("Test") url2="http://10.8.2.166/test/kensaku.php?msg="+Testです; mywin2 = window.open(url2,"",""); } } //--></script> このソースを実行すると、ID検索ボタンをクリックしても何も反応せず 1.bmpをクリックすると、Testとメッセージが表示され、画面左下に 警告マークが表示され、何も反応しません。 しかし、function open(select)を削除し、ID検索ボタンをクリック すると命令した処理を実行してくれます。 function openwin()を削除したらその逆も起きるのかと考えやって みたのですが、これについては上記と同じエラーでした。 なぜこのようになるのか原因が分かりません。 どなたかご存知の方がいらっしゃいましたら、アドバイスよろしく お願い致します。

  • window.openについて

    window.openを使って新しいウインドウを開きたいと思い質問させていただきます。 現在、 ---------------------------------------------------------------- <script type="text/javascript"> <!-- function w_opn() { newWin = window.open("abc.html","","width=200,height=300"); win.moveTo(0,0); } // --> </script> そして、BODY内に <a href="javascript:w_opn()">開く</a> --------------------------------------------------------------- というふうに作成しています。 この方法だと、リンク元が複数ある場合、HEAD内のJavaScriptも複数記述しないといけないと思うのですが、これをひとつのJavaScriptで制御したいのです。 どなたかご教授願えませんか?参考になるサイトのURLでも構いません。

  • window.openの使い方

    このようなスクリプトが動かないのは何故なのでしょう? <html> <script> var URL = "http://okweb.jp/"; GetW = window.open(URL,"Gets"); alert(GetW.document.readyState); </script> </html>

  • window.open でExcelファイルを開く

    window.openでブラウザからExcelファイルを開いています。 function test(){  window.open('test.xls',null); } IE6+XPですとExcelファイルのみが開いてくれるのですが、IE7.0+Vistaでは空のIEウィンドウも一緒に開いてしまいます。 window.openを使いつつ、空ウィンドウが開かないようにする良い方法は無いでしょうか。 IE6でもIE7でも同じようにExcelファイルが開けることが理想です。

  • window.openで新しいページを後ろ側に

    <SCRIPT language="JavaScript"> <!-- window.open("url"); //--> </SCRIPT> でページを開いたとき、もう一つのページを表示できますが、この方法だと、新たにopenしたページが元のページの 上に来てしまいます。 新しくオープンするウインドウが、このスクリプトを書いたページの後ろ側、背景にオープンする ようにはできないでしょうか。

  • window,open

    ★=window.open("▲","☆","■") で★と☆がウィンドウの名前と書いてあったのですが 区別がわかりません これは開いたウィンドウの名前なのでしょうか? それともこのスクリプトがあるウィンドウをさすのでしょうか? あとウィンドウの名前のつけ方も教えていただけたら うれしいです 具体的には newWin=window.open("control,html","newWIn","width =240.height=120"); と書いてありました

  • window.openについて

    ブラウザのメニューバーやアドレスバーを非表示する為に色々と調べていますがうまく調べる事ができませんでした。 自分なりに調べて記述して実行してみましたが動きがバラバラで・・・ <SCRIPT type="text/javascript">   window.open('http://localhost/menu.html', 'menu', 'menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=no,left=0,top=0');   if(document.all){     window.opener = true;   }   window.close(); </SCRIPT> JavaScriptは使った事があまりなくどうか皆さんのお知恵を私にお貸し下さい。 対象のブラウザはIE、Firefox、Opera、Safariです。 申し訳ありませんがアドバイス等をいただけませんでしょうか。 些細な事でも何でも構いませんのでご教授宜しくお願いします。

  • window.openでのブラウザ毎のサイズ指定

    お世話になります window.open("***.cgi","win","width=0px,height=0px") (***.cgiは計算処理などをしているだけなので表示はする必要はありません 処理が終わったらwindow.close()で閉じてます) これを実行すると IE6.0では左上に5cm角くらいのウィンドウが開いて(約2秒) Opera9.20では何も表示されない感じで Firefox2.0.0.3ではほぼフルサイズ(約2秒) のウィンドウになってしまいます 計算処理をするだけなので表示を見えなくするか最悪同じサイズのウィンドウにしたいのですがうまくいきません http://www.openspc2.org/reibun/javascript/sub_window/045/index.html こちらを試してみたのですがOpera,Firefoxでは同じサイズのウィンドウを開くのですがIE6.0では『Win,IE,6』というアラートが出てポップアップブロックされてしまいます ウィンドウ処理が自動生成になってしまうからだと思うのですがwindow.openでブラウザ毎のサイズ指定させることはできないのでしょうか?