Javascript biasa tidak bisa menutup windows mau tak mau. Ini adalah fitur keamanan, diperkenalkan beberapa waktu lalu, untuk menghentikan berbagai eksploitasi dan gangguan yang berbahaya.
Dari spesifikasi kerja terbaru untukwindow.close()
:
The close()
Metode pada Window objek harus, jika semua kondisi berikut terpenuhi, dekat konteks penjelajahan A :
- Konteks penelusuran yang sesuai A adalah script-closable .
- Konteks browsing script menjabat akrab dengan konteks penjelajahan A .
- Konteks yang sedang berada naskah menjabat diperbolehkan untuk menavigasi konteks penjelajahan A .
Konteks penelusuran dapat ditutup script jika konteks penelusuran tambahan yang dibuat oleh skrip (sebagai lawan dari 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. Standar implementasi Firefox menyatakan :
Metode ini hanya diperbolehkan dipanggil untuk windows yang dibuka oleh skrip menggunakan window.open
metode ini.
Jika Anda mencoba menggunakan window.close
dari skrip Greasemonkey / Tampermonkey / users Anda akan mendapatkan:
Firefox: Pesan kesalahan, " Scripts may not close windows that were not opened by script.
"
Chrome: gagal dalam diam-diam.
Solusi jangka panjang:
Cara terbaik untuk mengatasinya adalah dengan membuat ekstensi Chrome dan / atau Firefox sebagai tambahan. 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 sendiri". 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 akan bekerja dari kode yang disuntikkan hanya jika tab baru dibuka dan tidak memiliki halaman dalam riwayat penjelajahan. Jadi itu hanya berguna dalam situasi yang sangat kecil.
Namun, variasi masih berfungsi di Chrome (v43 & v44) plus Tampermonkey (v3.11 atau lebih baru) . Gunakan yang eksplisit @grant
dan polos window.close()
. 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 pembaruannya. 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.
window.close()
bekerja untuk saya di chrome.