読者です 読者をやめる 読者になる 読者になる

TechNote

とあるエンジニアのただのメモ

挙動が大事! JavaScriptでWindow.closeする時のブラウザ別対応まとめ

社内用のWebシステムにこれまで設置してなかった「閉じる」ボタンを設置することになった際、少々ブラウザ問題でつまずいた点があった。ググっても最近のwindow.close周辺の情報を見つけることができなかったのでまとめておく。

f:id:kojikoji75:20140113193038j:plain
photo credit: flod via photopin cc

サマリー

1.まず、閉じるボタンの必要性
2.IE(シェア:57.8%)の場合
3.Firefox(シェア:18.9%)の場合
4.Chrome(シェア:16.0%)の場合
5.safari(シェア:5.6%)の場合
6.まとめ

※ちなみにバージョンはie10、firefox26.0、chrome 31、safari 5.1.7です。

1.まず、閉じるボタンの必要性

ブラウザには標準で×(閉じる)ボタンがついているのに、どうして閉じるボタンを自作する必要が生じるのか?

一般的には、システム終了のタイミングで何らかの処理を走らせたい場合などが考えられる。

例えばログイン機能を持つWebシステムを複数人が同一PCで使用するような場合、ブラウザの×ボタンで閉じただけではCookieにユーザー情報が残ってしまったりするため、ブラウザの×ボタンを押されないような仕組みにするか、押された場合でもきちんと直前にログオフするような仕組みを設けるのが親切な設計である。

ただし、今回の場合はユーザー情報保持にCookieではなくセッションを使っているため、このような背景は関係ない(セッションだと閉じると同時にクリアされる)。単純にシニア層も使用する頻度が高いシステムだったため、ブラウザ上部に小さく存在する「×」ボタンにマウスフォーカスするのは億劫なのではないかという親切心から、大きめの閉じるボタンを設置したほうがいいのではという流れ。ユーザインターフェース面から設置することになったという珍しいパターンである。

f:id:kojikoji75:20131215214943j:plain





2.IE(シェア:57.8%)

いまだに大きなシェアを保持するIE(2013年8月時点でIE10は57.8%。ソースはここ。ちなみに当社内での使用比率は90%)を中心に考える。

まず、閉じるためのJavascriptを単純に下記のようにする。

onclick="window.close()"

⇒きちんと閉じてくれた。

但し、以下のような確認ダイアログが出るため、ユーザはクリック操作が一つ増えてしまう。

ウィンドウは表示中のWebページにより閉じられようとしています。このウィンドウを閉じますか?

f:id:kojikoji75:20131215215412j:plain

そこで以下のようにする。

onclick="window.open('about:blank','_self').close()"

⇒ワンクリックでキレイに閉じてくれた。


ieに対しては上記いずれの方法でも対応できたが、他のブラウザではどうか?
ieにはこれまで痛い目に合わされてきたので最低ランクに位置付けてはいるが、ieでできたからといってたかをくくってはいけない。一通り試してみると、少し意外な結果に...。






3.Firefox(シェア:18.9%)

onclick="window.close()"

⇒なんと閉じない。
但し、これはFirefoxデフォルトのセキュリティ設定によって閉じないようにしているだけ。config設定を修正するとwindow.closeはふつうに使用できる。Firefoxでwindow.closeが使えない問題は長年にわたって議論されてきた問題らしい。

urlのところに「about:config」と入力し、「細心の注意を払って使用する」をクリック。
f:id:kojikoji75:20131215215002j:plain

検索ボックスに「close」と入力して、close関連の設定のみ抽出し、「dom.allow_scripts_to_close_window」をダブルクリックで有効にする。
f:id:kojikoji75:20131215215327j:plain


ちなみにこのconfig設定なしに下記も実行してみる。

onclick="window.open('about:blank','_self').close()"

⇒空白タブが残るという気持ち悪い結果に。
上記config設定を行えばキレイに閉じる。







4.Chrome(シェア:16.0%)

onclick="window.close()"

⇒閉じない。

onclick="window.open('about:blank','_self').close()"

⇒閉じる。

Chromeの場合、逆にワンクリックで閉じるのを防ぐために「Window Close Protector」というアドオンが存在する模様。





5.safari(シェア:5.6%)

onclick="window.close()"

⇒閉じない。

onclick="window.open('about:blank','_self').close()"

⇒閉じる。





6.まとめ

IE 10 firefox 26.0 chrome 31 safari 5.1.7
window.close()のみ ×
⇒config設定で○
× ×
window.open('about:blank','_self').close() △タブが残る
⇒config設定で○


意外にもfirefoxに難ありという結果に。
このあたりの話がググってもあまり出てこないのは(露出が少ないだけ?)webサービスは個人向けという大前提のため、サービス提供側はcookieにはユーザー情報を残したいという考えがあり(当たり前だけど)、cookieを削除したい人はブラウザの設定でやってねという前提があるからか。

あわせて読みたい

jQuery UI を無駄なく使いこなすために必要な知識まとめ(各ファイルの役割など) - TechNotejQuery UI を無駄なく使いこなすために必要な知識まとめ(各ファイルの役割など) - TechNote

jQueryUIは、インタラクティブなWebサイトを開発するために使用されるjQueryベースのUIライブラリです。このため、多くのサイトで「簡単」「手軽」など...

システム管理者でなくても知っとくべき! Windowsサーバ/クライアントの時刻同期設定まとめ - TechNoteシステム管理者でなくても知っとくべき! Windowsサーバ/クライアントの時刻同期設定まとめ - TechNote

コンピュータの内臓時計はズレやすいため、「時刻同期」について検討することはとても重要なことと思われますが、その重要性はあまり認識されていない気がします。私も先日...

BootstrapにぴったりのWebアイコンフォント FontAwesome 4.0.0 が公開されていた件 - TechNoteBootstrapにぴったりのWebアイコンフォント FontAwesome 4.0.0 が公開されていた件 - TechNote

しばらくニュースをチェックできずにいて何気なくFontAwesomeのサイトを覗いてみたら、FontAw...


JavaScript 第6版

JavaScript 第6版

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)


広告を非表示にする