web-dev-qa-db-ja.com

window.closeとself.closeでChromeのウィンドウを閉じない

問題は、window.close()またはself.close()を起動してもウィンドウが閉じないことです。 Chromeでは、スクリプトで作成されていないウィンドウをスクリプトで閉じることはできないという確信があるようです。それは明らかに偽ですが、確認のためにアラートをポップアップ表示する必要がある場合でも、それを実行することになっているにもかかわらずです。これらは起こっていません。

それで誰もがjavascript:window.close()javascript:self.close()のようなものを使ってウィンドウを閉じる本当の、機能的で実証済みの方法を持っていますか。どんな提案でも非常に高く評価されるでしょう、そして私はJQueryやサードパーティの実装ではなく、JavaScript特有の解決策を探しています。

更新: /提案されたものの多くは深刻な制限とユーザビリティの問題を抱えていますが、// @grant window.closeをスクリプトヘッダに使用する最新の提案(TamperMonkeyに特有)はしばしばうまくいくそれらのタブ上でもトリックをするでしょうcloseメソッドを処理できません。完全に理想的ではなく、すべての場合に一般化されているわけではありませんが、それは私の場合は良い解決策です。

146
GµårÐïåñ

通常のJavaScriptでは、ウィンドウを何度も閉じることはできません。これは、悪意のあるさまざまな悪用や煩わしさを防ぐために少し前に導入されたセキュリティ機能です。

From window.close()の最新の動作仕様

Windowオブジェクトのclose()メソッドは、次の条件がすべて満たされる場合は、ブラウジングコンテキスト A を閉じます。

  • 対応するブラウジングコンテキスト Ascript-closable です。
  • 現在のスクリプトのブラウジングコンテキストは、ブラウジングコンテキスト A に精通しています。
  • 現在のスクリプトのブラウジングコンテキストは、ブラウジングコンテキスト A をナビゲートすることを許可されています。

ブラウジングコンテキストは、 script-closable それがユーザのアクションではなくscriptによって作成された)補助ブラウジングコンテキストである場合、またはそれがセッション履歴を持つブラウジングコンテキストである場合ドキュメントを1つだけ含みます。

これは、1つの小さな例外を除いて、javascriptは同じjavascriptによって開かれていないウィンドウを閉じることを許可されてはいけません。

Chromeはその例外を許可しています - それはユーザースクリプトには当てはまりません - しかしFirefoxはそうではありません。 Firefoxの実装は平坦化状態を示しています

このメソッドは、window.openメソッドを使用してスクリプトによって開かれたウィンドウに対してのみ呼び出すことができます。


Greasemonkey/Tampermonkey/userscriptからwindow.closeを使用しようとすると、次のようになります。
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月現在)ほとんどブロックされています。タブが新たに開かれ、閲覧履歴にページがない場合でも、 注入済み code only)から機能します。したがって、ごく一部の状況でのみ役に立ちます。

ただし、バリエーションは、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には同等の設定はありません。

166
Brock Adams

Chromeバージョン36.0.1985.125のセキュリティ問題を修正しました

Chrome 36.0.1985.125 2014年7月16日水曜日 リリースノート

私の観察によると、このアップデートはポップアップウィンドウを閉じるためにwindow.close()を使うことに関する問題を修正しました。 "スクリプトはそれによって開かれたウィンドウだけを閉じるかもしれません"という失敗時にコンソールにこれを見るでしょう。つまり、 ハックな回避策 (Brock Adamsの回答) うまくいかないかもしれません /最新のリリースでは。

そのため、以前のChromeリリースビルドでは、以下のコードブロックは機能する可能性がありますが、このアップデートでは機能しません。

window.open('', '_self', '');
window.close();

このアップデートでは、ポップアップウィンドウを閉じるためにそれに応じてコードを更新する必要があります。解決策の1つは、ポップアップウィンドウIDを取得して使用することです。

chrome.windows.remove(integer windowId, function callback)

それを削除する方法。 Chrome拡張ウィンドウAPIは chrome.windows にあります。

実際、私のクロムエクステンション MarkView がこの問題に直面していたので、このChrome Updateで機能するようにコードを更新する必要がありました。ちなみに、MarkViewはAwesome Markdownファイルを読み書きするためのツールです。コンテンツアウトライン、ソート可能なテーブル、コードブロックシンタックスハイライトなどの機能を提供します。

私も この記事 を作成しました。

29
swcool

Tampermonkeyでは今、あなたは使うことができます

// @grant        window.close

そして、単に電話するだけです。

window.close();
16
balping

私はBrock Adamsによって投稿された方法を使っています、そしてそれがユーザーによって開始されればそれはFirefoxでさえ動作します。

open(location, '_self').close();

私はボタンを押してそれを呼び出しているので、それは ユーザーが開始した であり、そしてそれはまだChrome 35-40、Internet Explorer 11、Safari 7-8およびALSO Firefox 29-35を使用してうまく働いている。 WindowsとMac OS X 10.6、10.9と10.10が違う場合は、バージョン8.1を使ってテストしました。


完全なコード:

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

このテストページを試してください。(Chrome 40とFirefox 35でテスト済み)

http://browserstrangeness.bitbucket.io/window_close_tester.htm

13
Jeff Clayton

多くの人々はまだjavascriptを使ってChromeブラウザを閉じる方法を見つけようとしています。 次の方法は、ChromeをAPPランチャーとして使用している場合にのみ機能します - キオスクなど。

私は以下をテストしました:

私は次の拡張子を使っています: キオスクを閉じる

私は使用法の指示に従っています、そしてそれはちょうどうまくいくようです(あなたがテストをしている間あなたがキャッシュをクリアすることを確認してください)。私が使用するJavaScriptは(クリックイベントに添付)です:

window.location.href = '/closekiosk';

それが私が見つけた唯一の実用的な解決策であるので、私はそれが誰かに役立つことを願っています。

注:この拡張機能はバックグラウンドで実行され、Chromeのトレイアイコンが追加されているようです。 「Chromeをバックグラウンドで実行させる」(または同様のテキスト)オプションがオンになっています。それはあなたのために働くまで、あなたはそれで遊ぶ必要があるかもしれません。私はそれをチェックしていなくて、そして今それはちょうどうまく動く!

9
Minister

それが「明らかに偽」であると考えているにもかかわらず、あなたが「信じるように思われる」と言うことは実際には正しいです。 window.close のMozillaドキュメント

このメソッドは、window.openメソッドを使用してスクリプトによって開かれたウィンドウに対してのみ呼び出すことができます。ウィンドウがスクリプトによって開かれていない場合は、JavaScriptコンソールに次のエラーが表示されます。スクリプトによって開かれていないウィンドウはスクリプトによって閉じられない可能性があります。

あなたはそれが「まだやることになっている」と言っていますが、私はあなたがそれを支持する何らかの参照を見つけることはないと思います、多分あなたは何かを誤解しましたか?

7
Gareth

私にぴったりの新しい方法を見つけました

var win = window.open("about:blank", "_self");
win.close();
5
Gerardo Abdo

以下のコードは私のために働きました -

window.open('location', '_self', '');
window.close();

テスト済み Chrome 43.0.2357.81

4
DfrDkn

これは古いかもしれませんが、答えてみましょう。

タブを閉じるには top.close() を使います。 window.close() または他のopen ... closeがうまくいきませんでした。

2
Soley

私の場合は、ページを閉じる必要がありますが、リンクによって開かれている可能性があるため、window.closeは失敗します。

私が選んだ解決策は、別のページにリダイレクトするwindow.closeが後に続くwindow.setTimeoutを発行することです。

このようにして、window.closeが成功するとそのページでの実行は停止しますが、失敗すると1秒以内に別のページにリダイレクトされます。

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
0
user2182349