通常のJavaScriptは、ウィンドウを完全に閉じることはできません。これは、しばらく前に導入されたセキュリティ機能であり、さまざまな悪意のある悪用や迷惑行為を阻止します。
以下からの最新の作業仕様window.close()
:
close()
Windowオブジェクトのメソッドは、以下の条件がすべて満たされた場合、ブラウジングコンテキストAを閉じる必要があります。
- 対応するブラウジングコンテキストAは、スクリプトで閉じることができます。
- 現在のスクリプトのブラウジングコンテキストは、ブラウジングコンテキストAに精通しています。
- 現在のスクリプトのブラウジングコンテキストは、ブラウジングコンテキストAをナビゲートできます。
ブラウジングコンテキストは、(ユーザーのアクションではなく)スクリプトによって作成された補助ブラウジングコンテキストである場合、またはセッション履歴に1つのドキュメントのみが含まれるブラウジングコンテキストである場合、スクリプトで閉じることができます。
つまり、1つの小さな例外を除いて、同じJavaScriptで開かれていないウィンドウをJavaScriptで閉じることは許可されません。
Chromeはその例外を許可しますが、これはユーザースクリプトには適用されませんが、Firefoxは許可されません。 Firefoxの実装はフラットアウト状態です:
このメソッドは、このメソッドを使用するスクリプトによって開かれたウィンドウに対してのみ呼び出すことができますwindow.open
。
window.close
Greasemonkey / Tampermonkey / userscript から使用しようとすると、
Firefox:エラーメッセージ " Scripts may not close windows that were not opened by script.
"
Chrome:静かに失敗します。
長期的な解決策:
これに対処する最良の方法は、代わりにChrome拡張機能やFirefoxアドオンを作成することです。 これらは、現在のウィンドウを確実に閉じることができます。
ただし、によって引き起こされるセキュリティリスクwindow.close
は、Greasemonkey / Tampermonkeyスクリプトの方がはるかに少ないためです。GreasemonkeyとTampermonkeyは、APIでこの機能を合理的に提供できます(基本的に、拡張機能の作業をパッケージ化します)。
機能のリクエストを検討してください。
ハックな回避策:
Chrome は現在、「自己リダイレクト」エクスプロイトに対して脆弱でした。したがって、このようなコードは一般的に機能していました:
open(location, '_self').close();
これはバグのある動作であるIMOであり、現在(およそ2015年4月の時点で)ほとんどブロックされています。タブが新しく開かれ、閲覧履歴にページがない場合にのみ、挿入されたコードから機能します。そのため、ごく一部の状況でのみ役立ちます。
ただし、バリエーションはChrome(v43およびv44)とTampermonkey(v3.11以降)で引き続き機能します。明示的@grant
でプレーンなを使用してくださいwindow.close()
。例えば:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
更新してくれたzanetuに感謝します。開いているタブが1つしかない場合、これは機能しません。追加のタブを閉じるだけです。
Firefoxはそのエクスプロイトに対して安全です。したがって、JavaScriptの唯一の方法は、一度に1つのブラウザでセキュリティ設定を無効にすることです。
あなたは開くことができますabout:config
し、設定
allow_scripts_to_close_windows
しますtrue
。
スクリプトが個人用である場合は、先に進んでください。他の誰かにその設定をオンにするように頼むと、彼らは賢く、正当化されて、偏見をもって拒否するでしょう。
現在、Chromeに相当する設定はありません。
window.close()
Chromeで動作します。