it-swarm-id.com

window.close dan self.close tidak menutup jendela di Chrome

Masalahnya adalah ketika saya menjalankan window.close() atau self.close() tidak menutup jendela. Sekarang tampaknya ada kepercayaan bahwa di Chrome Anda tidak dapat menutup dengan skrip jendela apa pun yang bukan skrip dibuat. Itu benar-benar salah tetapi terlepas dari itu seharusnya masih melakukannya, bahkan jika itu perlu muncul peringatan untuk mengonfirmasi. Ini tidak terjadi.

Jadi apakah ada yang punya metode nyata, fungsional dan terbukti menutup jendela menggunakan sesuatu seperti javascript:window.close() atau javascript:self.close() yang benar-benar melakukan apa yang diharapkan dan sesuatu yang terjadi dengan baik di setiap browser yang BUKAN berbasis Chrome? Setiap saran akan sangat dihargai dan saya mencari solusi spesifik Javascript, bukan JQuery atau implementasi pihak ketiga. 

Pembaruan: Sementara banyak dari apa yang telah disarankan memiliki keterbatasan serius dan masalah kegunaan, saran terbaru (khusus untuk TamperMonkey) menggunakan// @grant window.closedalam header skrip akan sering melakukan trik bahkan pada tab yang biasanya dapat menangani metode tutup. Meskipun tidak sepenuhnya ideal dan tidak digeneralisasikan untuk setiap kasus, ini adalah solusi yang baik untuk kasus saya.

141
GµårÐïåñ

Javascript biasa tidak bisa menutup windows mau tak mau. Ini adalah fitur keamanan, yang diperkenalkan beberapa waktu lalu, untuk menghentikan berbagai eksploitasi dan gangguan yang berbahaya.

Dari spec kerja terbaru untuk window.close() :

Metode close() pada objek Window harus, jika semua kondisi berikut terpenuhi, tutup konteks penelusuran A:

  • Konteks penelusuran yang sesuai A adalah script-closable.
  • Konteks penelusuran skrip petahana akrab dengan konteks penelusuran A.
  • Konteks penelusuran skrip petahana diizinkan untuk menavigasi konteks penelusuran A.

Konteks penelusuran adalah script-closable jika konteks penelusuran tambahan yang dibuat oleh skrip (tidak seperti tindakan pengguna), atau jika konteks penelusuran yang riwayat sesi hanya berisi satu Dokumen.

Ini berarti, dengan satu pengecualian kecil, javascript tidak boleh diizinkan untuk menutup jendela yang tidak dibuka oleh javascript yang sama.

Chrome mengizinkan pengecualian itu - yang tidak berlaku untuk skrip pengguna - namun Firefox tidak. Implementasi Firefox keluar menyatakan

Metode ini hanya diperbolehkan dipanggil untuk windows yang dibuka oleh skrip menggunakan metode window.open.


Jika Anda mencoba menggunakan window.close dari naskah Greasemonkey/Tampermonkey/Users Anda akan mendapatkan:
Firefox: Pesan kesalahan, "Scripts may not close windows that were not opened by script."
Chrome: gagal dengan diam-diam.



Solusi jangka panjang:

Cara terbaik untuk mengatasinya adalah dengan membuat ekstensi Chrome dan/atau Firefox add-on sebagai gantinya. Ini dapat dipercaya menutup jendela saat ini.

Namun, karena risiko keamanan, yang ditimbulkan oleh window.close, jauh lebih sedikit untuk skrip Greasemonkey/Tampermonkey; Greasemonkey dan Tampermonkey secara wajar dapat menyediakan fungsionalitas ini dalam API mereka (pada dasarnya mengemas pekerjaan ekstensi untuk Anda).
Pertimbangkan untuk membuat permintaan fitur.



Solusi peretasan:

Chrome saat ini rentan terhadap eksploitasi "pengalihan diri". Jadi kode seperti ini digunakan untuk bekerja secara umum:

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

Ini adalah perilaku buggy, IMO, dan sekarang (sekitar April 2015) sebagian besar diblokir. Itu masih bekerja dari disuntikkan kode hanya jika tab baru dibuka dan tidak memiliki halaman dalam riwayat penelusuran. Jadi itu hanya berguna dalam situasi yang sangat kecil.

Namun, variasi masih berfungsi di Chrome (v43 & v44) ditambah Tampermonkey (v3.11 atau lebih baru). Gunakan @grant eksplisit dan window.close() biasa. MISALNYA:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

Terima kasih kepada zanetu untuk pembaruan. Perhatikan bahwa ini tidak akan berfungsi jika hanya ada satu tab yang terbuka. Itu hanya menutup tab tambahan.


Firefox aman terhadap eksploitasi itu. Jadi, satu-satunya cara javascript adalah melumpuhkan pengaturan keamanan, satu per satu browser.

Anda dapat membuka about:config dan mengatur
allow_scripts_to_close_windows ke true

Jika skrip Anda untuk penggunaan pribadi, silakan dan lakukan itu. Jika Anda meminta orang lain untuk mengaktifkan pengaturan itu, mereka akan menjadi pintar, dan dibenarkan, untuk menolak dengan prasangka. 

Saat ini tidak ada pengaturan yang setara untuk Chrome.

158
Brock Adams

Chrome Memperbaiki masalah keamanan pada versi 36.0.1985.125

Chrome 36.0.1985.125 RABU, 16 JULI 2014 Catatan rilis

Dari pengamatan saya, pembaruan ini memperbaiki masalah penggunaan window.close() untuk menutup jendela sembulan. Anda akan melihat ini di konsol ketika gagal, "Script dapat menutup hanya jendela yang dibuka olehnya." Itu berarti Penanganan peretasan (jawaban Brock Adams) mungkin tidak berfungsi dalam rilis terbaru.

Jadi, di build Chrome yang dirilis sebelumnya, blok kode di bawah ini mungkin berfungsi tetapi tidak dengan pembaruan ini.

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

Untuk pembaruan ini, Anda harus memperbarui kode Anda sesuai untuk menutup jendela sembulan. Salah satu solusinya adalah dengan mengambil id jendela popup dan menggunakannya 

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

metode untuk menghapusnya. API jendela ekstensi Chrome dapat ditemukan di chrome.windows

Sebenarnya ekstensi chrome saya MarkView menghadapi masalah ini dan saya harus memperbarui kode saya agar berfungsi untuk Pembaruan Chrome ini. Omong-omong, MarkView adalah alat untuk membaca dan menulis File Markdown yang Luar Biasa, MarkView menyediakan fitur termasuk Content Outline, Sortable Tables dan highlight sintaks blok kode dengan nomor baris.

Saya juga membuat posting ini , ada komentar yang diterima.

27
swcool

Di tampermonkey sekarang Anda bisa menggunakan

// @grant        window.close

Dan kemudian cukup menelepon

window.close();
16
balping

Saya menggunakan metode yang diposting oleh Brock Adams dan bahkan berfungsi di Firefox, jika itu diinisiasi pengguna.

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

Saya memanggilnya dari tombol tekan jadi pengguna dimulai, dan masih berfungsi baik menggunakan Chrome 35-40, Internet Explorer 11, Safari 7-8 dan JUGA Firefox 29-35. Saya diuji menggunakan versi 8.1 Windows dan Mac OS X 10.6, 10.9 & 10.10 jika itu berbeda. 


Kode lengkap:

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;   
}

Coba halaman pengujian ini: (Sekarang diuji di Chrome 40 dan Firefox 35) 

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

13
Jeff Clayton

Banyak orang masih berusaha menemukan cara untuk menutup browser Chrome menggunakan javascript. Metode berikut hanya berfungsi ketika Anda menggunakan Chrome sebagai peluncur APP - misalnya kios!

Saya telah menguji yang berikut ini:

Saya menggunakan ekstensi berikut: Tutup Kios

Saya mengikuti petunjuk penggunaan dan tampaknya berfungsi dengan baik (pastikan Anda menghapus cache saat melakukan tes). Javascript yang saya gunakan adalah (terlampir untuk mengklik acara):

window.location.href = '/closekiosk';

Saya harap itu membantu seseorang, karena itu satu-satunya solusi yang saya temukan.

Catatan: Tampaknya ekstensi berjalan di latar belakang dan menambahkan ikon baki Chrome. Opsi berikut dicentang: "Biarkan Chrome berjalan di latar belakang" (atau teks serupa). Anda mungkin perlu bermain dengannya, sampai berhasil. Saya tidak mencentangnya dan sekarang berfungsi dengan baik!

9
Minister

Meskipun berpikir itu "benar-benar salah", apa yang Anda katakan "tampaknya menjadi kepercayaan" sebenarnya benar. Dokumentasi Mozilla untuk window.close mengatakan

Metode ini hanya diperbolehkan dipanggil untuk windows yang dibuka oleh skrip menggunakan metode window.open. Jika jendela tidak dibuka oleh skrip, kesalahan berikut muncul di Konsol JavaScript: Skrip mungkin tidak menutup jendela yang tidak dibuka oleh skrip

Anda mengatakan bahwa itu "seharusnya tetap melakukannya" tetapi saya tidak berpikir Anda akan menemukan referensi yang mendukung itu, mungkin Anda salah ingat sesuatu?

5
Gareth

Kode di bawah ini berfungsi untuk saya -

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

Diuji pada Chrome 43.0.2357.81

4
DfrDkn

Ini mungkin sudah tua, tapi mari kita jawab. 

Saya menggunakan top.close () untuk menutup tab. window.close () atau buka lainnya ... tutup tidak bekerja untuk saya.

2
Soley

Dalam kasus saya, halaman harus ditutup, tetapi mungkin telah dibuka oleh tautan dan karenanya window.close akan gagal.

Solusi yang saya pilih adalah dengan mengeluarkan window.close, diikuti oleh window.setTimeout yang dialihkan ke halaman lain.

Dengan begitu, jika window.close berhasil, eksekusi pada halaman itu berhenti, tetapi jika gagal, dalam sedetik, itu akan dialihkan ke halaman lain.

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