• ベストアンサー

最新のGeckoエンジンに対応するwindow.close

前の質問に回答が付かなかったので削除して再度質問させていただきます。 Geckoエンジンでwindow.closeが効かない問題は結構有名でこれまで これまた以下にあるような有名な方法で対応していました。 http://tosaka.org/tips/javascript.html ところが、現在の最新バージョンのGeckoエンジンではこれでも閉じる ことができないようです。 確認した限りではFx 1.5.0.12(Gecko/20070508)では閉じることが できますがSeaMonkey 1.1.11(Gecko/20080702)では閉じることができず about:blankページになるだけです。 現在ではFxなどGeckoエンジン勢も無視できない状態ですのでこれを 何とか無理矢理閉じる方法はないものでしょうか。 (上記の方法も無理矢理でしたが...) top.nameの名前を変えてみたり、self.closeにしてみたりと自分でも 一応根拠なく思いつく限りいろいろ試したもののできませんでした。 セキュリティなどのためとはいえ、あまりにも不便すぎます。 関連質問 http://oshiete1.goo.ne.jp/qa2765613.html (こちらではできないという結論になっています) なお、IE(Trident IV)及びOp(Presto)やSF(WebKit)では正常に閉じる ことができています。 セッション管理の後始末も兼ねているため、極力閉じるボタンを押して 欲しいので閉じることができないと困ります。 (もちろんそれでも閉じるボタンを押さないで閉じる人もいるだろうから 一定時間経つと自動で後始末するようにはしています)

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

  • ベストアンサー
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.3

>window.open で開いたウィンドウで window.close openをしたwindowで?openされたwindowで? 前者なら勿論「window.close()」という記述ではおかしいのは判るよね 後者でならとりあえず開いたwindowをオブジェクトとして取得して、それを使ってcloseかけられないか試してみたらどうだろう

pick52
質問者

お礼

どうもありがとうございます。 どうやら、タブブラウザ拡張が原因だったようです。 タブブラウザ拡張をアンインストールしたら閉じることができるように なりました。 どうやら、タブブラウザ拡張機能の中で廃止された機能が使用されて いたことが直接の理由となって途中でエラーがでていたようです。 SM1.1.1及びFx3.0でも正常に閉じることを確認できました。 (この際なのでFxをバージョンアップしました) タブブラウザ拡張はTab Mix Plusに置き換えました。 お手数かけてすみませんでした。

その他の回答 (2)

回答No.2

本来、自分で開いたんじゃないWindowを閉じる権限は持たせるべき じゃないんだから、スクリプトに閉じさせたいWindowはスクリプト に開かせるのが常道です。自分の子しか閉じさせないのもアリ。 セッション管理が目的なら、body要素のonUnLoad属性で後始末用の スクリプトでも呼んでみてはどうでしょう。

pick52
質問者

補足

回答ありがとうございます。 > 本来、自分で開いたんじゃないWindowを閉じる権限は持たせるべき > じゃないんだから、...(後略) 閉じようとしているのは自分で開いたウィンドウです。 一応、ANo.1さんの補足にも書いたようにアンカータグで target="_blank" としていたのを var wind = window.open('test.html', 'test'); として、開いたウィンドウ上で window.close(); を実行してみましたが閉じられないようです。 (target="_blank" の時とエラー内容は違っています) > セッション管理が目的なら、body要素のonUnLoad属性で後始末用の > スクリプトでも呼んでみてはどうでしょう。 すみません。 onunloadはページの推移でも呼ばれるため、これは使用できません。 また、閉じるボタンが必要なのは送信完了したフォームのウィンドウを 閉じたいということでもあるので...。 この動作自体がとりあえず確認できた限りではGeckoのみで発生して いるということも頭を悩ませている原因なんです。 他のエンジンでも同様の方向性なら、もう諦めるしかないのですが...。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

>あまりにも不便すぎます 発想が逆だよ。 そもそも複数ウィンドウやフレームを前提に作るべきではないとしているのだから(以下略) http://developer.mozilla.org/ja/DOM/window.close ---------------一部抜粋--------------- このメソッドが許可されるのは、window.open メソッドを用いたスクリプトによって開かれたウィンドウに対して呼び出されたときのみ -------------------------------------- つまりwindow.openを介さずに開いた物は対象外。(aタグtarget等) それに合致していて閉じれないなら仕様だね。 ショップサイトとかで別窓の殆どがwindow.openで作ってあるのはそういう理由じゃないかな。

pick52
質問者

補足

回答ありがとうございます。 そのGeckoエンジン独特の流儀がよく分からないのです。 そもそも、複数ウィンドウやフレーム自体を非推奨としていることも 分からないのです。 確かに本来のHTMLの概念からは当然の流れなのかもしれませんが、 実際に利用されている用途とは相反しています。 なお、試しに window.open で開いたウィンドウで window.close を してみたのですが、これでも閉じることができませんでした。 エラーコンソールには以下のようにでています。 Warning: Event=click, use of preventCapture() is deprecated. Use W3C standard stopPropagation() instead. Source File: chrome://navigator/content/navigator.xul Line: 0 Warning: Event=click, use of preventBubble() is deprecated. Use W3C standard stopPropagation() instead. Source File: chrome://navigator/content/navigator.xul Line: 0 Error: browsers.item is not a function Source File: chrome://navigator/content/navigator.js Line: 477

関連するQ&A

  • レンダリング・エンジン(Trident、Gecko、WebKit)って

    レンダリング・エンジン(Trident、Gecko、WebKit)って何ですか? 最近にブラウザにはTrident、Gecko、WebKitというのがあるということを知りました。 これらは何なんですか。ネットで調べたんですけどもイマイチ解りません。 簡単に解り易く教えていただけませんでしょうか? よろしくお願いいたします。

  • IE8に更新した後、Web上の全てのボタンが小さくなってしまいました

    IE8をインストールした後、googleの検索ボタンなど、全てのボタンが小さく表示されるようになってしまいました(Wikipediaの検索ボタンは正常に表示されます) IE8を再インストールしても変わらず、困っています GeckoやWebkitやPrestoなどのTrident以外のエンジンだと正常に表示することが出来ます IE7にダウングレードすることも考えてみましたが、やっぱり速度は譲れません

  • Gecko エンジンでの Location ヘッダについて

    以前に投稿したのですが回答が得られなかったので削除して再質問です。 Gecko エンジンで Location ヘッダを送信してリダイレクトした後の ページで更新(ページリロード)すると反応がおかしいようです。 例えば a というページから b というページにリダイレクトをして b で更新をかけるとページの URL は a であると判断されてしまうよう です。 # 検証用 CGI (index.cgi) use strict; &main(); sub main { my $cgi = &getreq(); my $min = (localtime())[1]; # キャッシュしない print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; if($cgi->{'min'} eq '') { # $cgi->{'min'} が空なら # (Gecko では更新した時にもこっちにくる) print "Location: ./?min=$min\n\n"; exit; } elsif($cgi->{'min'} ne $min) { # 分が異なる場合 (Gecko はこない) print "Content-type: text/plain\n\n"; print "\$cgi->{'min'}=$cgi->{'min'}\n"; exit; } # $cgi->{'min'} と $min が同じ print "Content-type: text/plain\n\n"; print "min=$min\n"; exit; } sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } CGI::Session でセッション管理をしようとしたところ、IE(Trident)と Opera(Presto)では正常なのですがFirefoxでうまく動作しなかったので よく調べてみたところこのような状態です。 どうにかならないでしょうか。 因みに、後で調べてみるとSafari(WebKit) for Winでも正常でした。 現象が発生するのはGeckoのみです。 (Fxの他、SeaMonkeyでも同様の現象を確認しています)

    • ベストアンサー
    • CGI
  • Lunascapeの設定について

    今までIEを使っていましたが、試しで今Lunascapeを使っています。 エンジンにTridentを使うと今までのIEと同じ動作をするのですが、geckoやWebKitを使うと、戻る/進むときのカチッという音がしません。 また、戻る/進むボタンの三角を押しても、「1つ前へ」とか出るだけでサイト名を表示してくれないし、IEのときは10個出たのに5個しか出ません(それに、まだ1回しか進んでないのに、1つ前へ~5つ前へって5個出るし)。 これらを改善する方法を教えてください。 お願いします。

  • windowのクローズについて

    javascriptを以下のように利用する方法として より良い方法を教えてください。 現在、1つのフォームに2つのボタン(b1,b2)を利用して ・b1 を押すと新しいウィンドウ(w1)を作成(立ち上げる) ・b2 を押すとウィンドウ(w1)をクローズする というものを作成しています。 b1実行時の処理として w1 = window.open("about:blank","w1"); document.forms[0].target="w1"; retun true; b2実行時の処理として document.forms[0].target="_top"; if(!w1.closed)w1.close(); return true; このようにした場合、 一度、b1を実行してウィンドウ(w1)を立ち上げてから b2を実行すれば何も問題なくウィンドウ(w1)は閉じます。 しかし、b1を実行していない場合や、 ユーザが自分でウィンドウ(w1)を閉じた場合、b2実行時に IEで「ランタイムエラー w1が宣言されていません」 とエラーが出ます。 (エラーが出るだけで処理自体は問題ないようです) どのように記述すればエラーになりませんか?

  • 続Gecko エンジンでの Location ヘッダについて

    Gecko エンジンでの Location ヘッダについて http://oshiete1.goo.ne.jp/qa4227374.html の続きです。 なんだかよく分からない状況になったのでより実際の処理とほぼ同様の 処理を行っているサンプルを用意しました。 # セッション管理 use strict; use CGI::Session; &main(); # メイン sub main { my $cgi = &getreq(); print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; # セッション取得 my $session = &session($cgi); # セッションが取得できない場合、再取得 if($session == undef) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; $session = &session({}); # セッション ID を取得してリダイレクト my $id = $session->id(); print "Location: ./?CGISESSID=$id\n\n"; exit; } my $id = $session->id(); if($cgi->{'CGISESSID'} eq '' || $cgi->{'CGISESSID'} ne $id) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; # セッション ID が指定されていないまたは # セッション ID が異なる場合リダイレクト print "Location: ./?CGISESSID=$id\n\n"; exit; } print "Content-type: text/plain\n\n"; print "CGISESSID=$id\n"; print "OK\n"; exit; } # CGI リクエストの取得 sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } # セッション取得 sub session { my $cgi = shift; my $dir = { 'Directory' => 'tmp' }; CGI::Session->find(undef, sub {}, $dir); if($cgi->{'CGISESSID'} eq '') { my $session = new CGI::Session(undef, undef, $dir); $session->expire("1h"); return $session; } my $session = CGI::Session->load(undef, $cgi->{'CGISESSID'}, $dir); return ($session == undef || $session->id() eq '') ? undef : $session; } こんな感じのCGIで以下のような状況の時にページを更新すると IE(Trident)/Opera(Presto)及びSafari for Win(WebKit)では 正常に動作するのですがFxやSeaMonkey(Gecko)ではおかしな動作を します。 1. セッションが切れた時 2. セッションファイルを手動で削除した時 具体的にはセッションが切れたら再度新しいセッションを作成して リダイレクトをするようにしてあるのですがGeckoでは一度セッションが 切れると更新する度に新しいセッションを作成するようになってしまい ます。 以前の質問の回答のように Status: 303 See Other ヘッダを出力して 見たのですがやはり効果はないようです。 Cookieは使いたくないのでセッションID(sesid)をCGIリクエストで 送信しているのですがこの方法がまず問題なのでしょうか。 他にも問題のある部分がありましたらご指摘お願いします。

    • ベストアンサー
    • CGI
  • 「window.close()」を一括削除したい

    WEBでよく見かける「閉じる」ボタンについて質問です。 <a href="#" onclick="javascript:window.close();">画面を閉じる</a> <input type="button" onclick="javascript:window.close();" value="画面を閉じる" /> ↑のようなHTMLをJavaScriptで一括して削除したいです。 var elements = document.getElementsByTagName('*'); for (var i = 0; i < elements.length; i++) { if (elements[i].onclick == 'javascript:window.close();') { elements[i].style.display = 'none'; } } 上記のようなJavaScriptを書きましたが、if文のところでうまく動きません(当たり前ですね) 何か良い方法はありませんでしょうか。 ご教授願います。

  • Lunascape6のキャッシュ保存容量

    Lunascape6を使っている方に質問です。 Tridentを使う分には、基本IEと同じなのでキャッシュの保存先や容量の上限の設定はわかるのですが、Geckoの場合、保存先の変更はわかったのですが、上限の設定がわかりません。 どなたかご存じな方いらっしゃいましたら教えてください。m(__)m できればWebkitのキャッシュの保存先と上限の設定もわかればお願い致します。

  • Firefoxでタブのクローズボタンを非表示に

    Firefox91(現時点最新版)を使っています。 各タブにフォーカスすると出てくるクローズボタンを表示しないように出来ないでしょうか?アドオンを使う方法でも良いです。 検索しても古いバージョンの情報しかないです。 userChrome.cssに下記を書いてみましたが効かず。 .tabbrowser-tab .tab-close-button { display: none !important; } about:configの、browser.tabs.closebuttonsも、もちろん駄目です。

  • ホームページビルダーのレイアウト・レンダリングエンジン

    よくある質問の一つに, 「WYSIWYG系のソフトウェアを使った見た目と実際にブラウザで見たときの見た目が違います、何でですか?」っていうのがあります。(この時,大抵ユーザーはIEでの確認を行っていると思います) レイアウトエンジンが同じであれば基本的に同じレイアウトになると思っていて,IEのエンジン(Trident)使っていると思っていた自分には不思議でした。(バージョンの違いはあるので厳密には異なるが) で、調べてみたら http://en.wikipedia.org/wiki/List_of_layout_engines Macromedia Dreamweaver MXやAdobe Creative Suite 2はPresto,つまりOperaと同じエンジンであることを知りました。 #Operaの挙動を調べれば回答での説明ができますよね! さて,これらのソフトと共に良く出てくる「IBM Websphere HomePage Builder」のレイアウトエンジンは何でしょうか? #回答いただく際には文献引用による確度向上を推奨します #「レイアウトエンジン」という用語で統一してみたが,「レンダリングエンジン」とは違うの?同じなの?

    • 締切済み
    • CSS

専門家に質問してみよう