Masalahnya adalah ketika saya memohon 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.close
di header skrip akan sering melakukan trik bahkan pada tab yang biasanya tidak dapat menangani metode penutupan. Meskipun tidak sepenuhnya ideal dan tidak digeneralisasikan untuk setiap kasus, ini adalah solusi yang baik untuk kasus saya.
window.close()
bekerja untuk saya di chrome.window.close
tidak berfungsi sebagaimana mestinya, saya pikir itu mungkin lebih bermanfaat daripada mengatakan, "itu tidak berhasil".<a href="javascript:window.close">CLOSE</a>
Jawaban:
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 untuk
window.close()
: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 :
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
saatini rentan terhadap eksploitasi "pengalihan sendiri". Jadi kode seperti ini digunakan untuk bekerja secara umum: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 poloswindow.close()
. MISALNYA: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 mengaturallow_scripts_to_close_windows
ketrue
.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.
sumber
dom.allow_scripts_to_close_windows;false
ketrue
tapi saya rasa tidak ada apa-apa di Chrome tanpa meretas sumber / membangun kembali yang merupakan cara saya mengatasinya untuk saat ini. Saya tahu dan telah berbicara dengan pengembang TM dan dalam alpha / beta baru-baru ini kami menempatkannya sebagai opsi kompatibilitas (pengaturan skrip) untuk berjalan dalam gaya man-in-the-middle, berfungsi. Saya kira pendek dari peretasan kami tidak memiliki solusi bersih, kasihan.window.close()
akan bekerja di Tampermonkey jika Anda menetapkan@grant
nilai selainnone
. Lihat utas ini .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 The hacky workarounds (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.
Untuk pembaruan ini, Anda harus memperbarui kode Anda sesuai untuk menutup jendela sembulan. Salah satu solusinya adalah dengan mengambil id jendela popup dan menggunakannya
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.
sumber
open(location, '_self').close();
- perhatikan penggunaan nilai balik dariopen()
. Ini masih berfungsi di Chrome36.0.1985.125 m
open(location, '_self').close();
, saya mendapat kesalahan "Tidak Sah" dalam hal ini. Kesalahan ini berbeda dengan 'window.close ()(warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,' _self '). Close (); `bergerak sedikit ke depan, tetapi tidak dapat menyelesaikan dalam kasus saya. Terima kasih @ brock-adams atas komentarnya.chrome.windows.remove
mengatakannya tidak dapat menemukan simbol chrome. bagaimana saya bisa menyelesaikan ini? apakah saya perlu menambahkan semacam referensi?Di tampermonkey sekarang Anda bisa menggunakan
Dan kemudian cukup menelepon
sumber
Saya menggunakan metode yang diposting oleh Brock Adams dan bahkan berfungsi di Firefox, jika itu diinisiasi pengguna.
Saya memanggilnya dari tombol tekan sehingga pengguna diinisiasi , 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 Jendela Penutupan Sendiri (pada halaman yang menutup sendiri)
Kode lengkap untuk digunakan pada jendela yang dibuka pengguna yang dapat menutup sendiri:
window_to_close.htm
JavaScript:
HTML:
Coba halaman pengujian ini: (Sekarang diuji di Chrome 40 dan Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Kode Pembuka Jendela (pada halaman yang membuka halaman di atas)
Untuk membuat ini berfungsi, kompatibilitas lintas browser yang diberlakukan keamanan mensyaratkan bahwa jendela yang akan ditutup harus sudah dibuka oleh pengguna mengklik tombol dalam domain situs yang sama.
Misalnya, jendela yang menggunakan metode di atas untuk menutup sendiri, dapat dibuka dari halaman menggunakan kode ini (kode disediakan dari halaman contoh saya yang ditautkan di atas):
window_close_tester.htm
JavaScript:
HTML:
sumber
<button onclick="open(location,'_self').close()" >Close Window</button>
. Apakah saya melakukan sesuatu yang jelas salah? Bagiku ini juga diprakarsai oleh pengguna. Perhatikan bahwa saya mendapatkan hasil yang sama jika saya menggunakan a<button>
atau a<input type="button">
.window.open('', '_self', ''); window.close();
tetapi berhasil denganopen(location, '_self').close();
Banyak orang masih berusaha menemukan cara untuk menutup browser Chrome menggunakan javascript. Metode berikut hanya berfungsi ketika Anda menggunakan Chrome sebagai peluncur aplikasi - 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):
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!
sumber
Meskipun berpikir itu "benar-benar salah", apa yang Anda katakan "tampaknya menjadi kepercayaan" sebenarnya benar. Dokumentasi Mozilla untuk window.close mengatakan
Anda mengatakan bahwa itu "seharusnya tetap melakukannya" tetapi saya tidak berpikir Anda akan menemukan referensi yang mendukung itu, mungkin Anda salah ingat sesuatu?
sumber
Saya menemukan cara baru yang bekerja untuk saya dengan sempurna
sumber
Kode di bawah ini berfungsi untuk saya -
Diuji pada Chrome 43.0.2357.81
sumber
Ini mungkin sudah tua, tapi mari kita jawab.
Saya menggunakan top.close () untuk menutup tab. window.close () atau buka lainnya ... tutup tidak berfungsi untuk saya.
sumber
"Scripts may not close windows that were not opened by script."
masalah yang disebutkan dalam jawaban lain.Dalam kasus saya, halaman perlu ditutup, tetapi mungkin telah dibuka oleh tautan dan karenanya
window.close
akan gagal.Solusi yang saya pilih adalah dengan menerbitkan
window.close
, diikuti olehwindow.setTimeout
yang mengalihkan 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.sumber
Jawaban dari Brock membuatnya bekerja untuk saya. javascript tidak boleh diizinkan untuk menutup jendela yang tidak dibuka oleh javascript yang sama.
Saya hanya bisa menutup jendela anak jika saya akan menutupnya dari javascript induk. jadi pada orang tua saya, saya bisa melakukan sesuatu seperti ini.
sumber
Anda juga dapat mencoba menggunakan kode saya di bawah ini. Ini juga akan membantu Anda untuk mengarahkan ulang jendela induk Anda:
Induk:
Muncul:
sumber
Untuk TamperMonkey:
Ref: https://www.tampermonkey.net/documentation.php#_grant
sumber
Hanya jika Anda membuka jendela baru menggunakan window.open () maka jendela baru dapat ditutup menggunakan kode seperti yang saya sebutkan di atas. Ini berfungsi dengan baik untuk saya :) Catatan: Jangan pernah menggunakan href untuk membuka halaman di tab baru. Window.close () tidak berfungsi dengan "href". Gunakan window.open () sebagai gantinya.
sumber
Saya ingin membagikan "solusi" saya dengan masalah ini. Sepertinya sebagian besar dari kita mencoba untuk menutup jendela browser dalam sesi browser standar, di mana pengguna mengunjungi beberapa situs web, setelah mereka mengunjungi situs web lain, dan sebelum mereka mengunjungi situs web lain.
Namun, situasi saya adalah saya membuat aplikasi web untuk perangkat yang pada dasarnya akan menjadi satu-satunya hal yang dilakukan perangkat. Anda mem-boot-nya, meluncurkan Chrome dan menavigasi ke aplikasi kami. Bahkan tidak terhubung ke internet, server mana pun yang diajak bicara berada di wadah Docker lokal kami. Pengguna membutuhkan cara untuk menutup aplikasi (alias tutup Chrome) sehingga mereka dapat mengakses terminal untuk melakukan pembaruan sistem.
Jadi boot, luncurkan Chrome dalam mode kios, di alamat yang benar. Ini terjadi untuk dengan mudah memenuhi opsi kedua dalam spesifikasi:
Jadi cukup menelepon
window.close()
dari aplikasi kios saya hanya berfungsi !sumber
Coba sesuatu seperti ini onclick = "return self.close ()"
sumber