Bagaimana mencegah peringatan JavaScript yang menyala saat meninggalkan halaman?

12

Banyak halaman memiliki peringatan ketika Anda meninggalkannya: jika Anda menutup tab, bernavigasi tanpa menyimpan, dll, ada banyak alasan mengapa situs akan memperingatkan / memblokir Anda agar tidak pergi sampai Anda mengkonfirmasi peringatan, misalnya "Anda yakin ingin bernavigasi dari halaman ini? "

Ini biasanya dilakukan dengan onbeforeunloaddan / atau onunloadpenangan.

Berikut ini sebuah contoh.

Apakah ada cara saya bisa mencegah peringatan / peristiwa pemblokiran pengguna yang dihasilkan oleh penangan itu? Pada dasarnya, saya ingin membiarkan JS diaktifkan, dan secara khusus melarang hal-hal yang akan mencegah saya meninggalkan halaman tanpa terjadi klik tambahan.

onbeforeunloaddan onunloadpawang harus tetap menembak; mereka seharusnya tidak diizinkan melakukan hal-hal yang memblokir pengguna. Itu berarti tidak ada peringatan, dan tidak ada operasi yang memakan waktu lebih dari beberapa detik.

Saya telah menemukan beberapa plugin yang mengedit / greasemonkey menambal javascript untuk halaman tertentu, dan bermain dengan kode mereka sedikit untuk mencoba dan membuatnya lebih berlaku secara universal. Namun, saya berharap menemukan solusi yang berfungsi pada halaman mana saja yang mencoba untuk memblokir keluar pengguna.

Zac B
sumber
Bisakah Anda memposting URL yang melakukan itu?
golimar
Diedit, ditambahkan contoh. Juga, saya mengerti mengapa perilaku ini sering diinginkan, dan bahwa diperlukan untuk mencegah kehilangan data yang tidak disengaja dalam banyak kasus. Saya masih ingin tahu bagaimana menimpanya / menonaktifkannya.
Zac B
Catatan: semua jawaban saat ini (yang memodifikasi onbeforeunload) hanya akan berfungsi untuk halaman yang menggunakan onbeforeunload, bukan untuk halaman yang menggunakan salah satu metode lain untuk melampirkan acara.
Synetech

Jawaban:

7

Nah, hal paling sederhana untuk dilakukan adalah menimpa skrip halaman secara langsung, dan menugaskan kembali acara tersebut null.

window.onbeforeunload = null;

Ini harus bekerja di mana saja, kecuali jika mereka benar-benar jahat, dan terus menugaskannya sendiri. Dalam kasus seperti itu, loop untuk menjaga pengaturan nullmungkin akan berfungsi.

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

Sekarang, berhati-hatilah, beberapa halaman menggunakannya untuk kebaikan. Ambil halaman unggah YouTube: Jika Anda menavigasi selama unggahan, Anda mungkin telah kehilangan banyak kemajuan! Atau mungkin formulir web yang Anda isi, yang mungkin tidak ingin Anda isi lagi, atau pesan (forum / email) yang mungkin tidak ingin Anda ketik ulang. Dengan fitur ini, Anda terlindungi.

Masalah lain adalah setiap halaman yang menggunakan ini untuk tujuan sekunder, seperti menyimpan data oleh AJAX. Mereka dapat menggunakan acara ini untuk memicu tindakan simpan, dan berharap bahwa pengguna membutuhkan waktu cukup lama untuk mengklik tombol agar permintaan dapat dilalui. Sekali lagi, ini sering dilakukan untuk menyelamatkan Anda dari diri sendiri.

Tapi, jelas, kita semua tahu banyak halaman menggunakan ini untuk sakit. Jadi, jika Anda tahu halaman mana saja yang Anda inginkan berfungsi, Anda selalu bisa memiliki sistem daftar putih. Sebenarnya tidak ada cara untuk memblokir tindakan ini, tanpa benar-benar memblokir window.onbeforeunload, dan tindakan (mungkin bagus) yang mungkin diambil.

Tidak ada cara (tanpa pengetahuan sebelumnya tentang kode halaman yang diberikan) untuk menjaga tindakan yang baik saat menghentikan kotak popup. Kotak ini bukan sebuah alert(). Kotak dihasilkan oleh browser, sebagai perilaku yang dimaksudkan oleh onbeforeunload. Seseorang menciptakannya dengan membuat fungsi apa pun yang mereka tetapkan untuk window.onbeforeunloadmengembalikan string. String itu akan dicetak di popup.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

Dengan demikian, Anda tidak akan dapat memblokir popup tanpa menghapus fungsinya.

Plus, jika Anda menemukan cara, AJAX apa pun akan gagal. Munculan memberi permintaan waktu untuk melewati, tanpa itu, data dapat hilang.

Adapun onunload, seharusnya tidak mungkin untuk memblokir Anda dengan ini. Karena menyala setelah halaman dibongkar. Tapi agar aman, Anda selalu bisa melakukan window.onunload = null;dan itu harus diurus.

zeel
sumber
Jenis pekerjaan seperti itu, tetapi bagaimana jika onbeforeunloadpawang melakukan sesuatu yang penting? Misalnya, bagaimana jika membuat permintaan AJAX singkat, atau melakukan sesuatu untuk penyimpanan HTML5 lokal? Apakah ada cara untuk mencegah onbeforeunloadpenangan melakukan panggilan tertentu (yaitu alert()), atau berjalan lebih lama dari periode waktu tertentu? Itu sebabnya saya bertanya tentang ekstensi daripada hanya skrip jenis-greasemonkey: sepertinya, untuk melakukan ini dengan benar, harus ada sesuatu yang berubah di tingkat mesin JavaScript.
Zac B
1
Saya telah menambahkan beberapa informasi lebih lanjut. Sejauh benar-benar memperbaiki ini di tingkat yang lebih rendah, ekstensi sebenarnya bukan tingkat yang lebih rendah. Mereka memang memiliki izin yang lebih tinggi, dan beberapa API khusus, tetapi mereka tidak memiliki kemampuan untuk mengubah fungsi inti browser. Saya tidak yakin seberapa dalam pemasangan FF, saya tidak punya pengalaman di bidang itu. Jelas, sebagai open source, Anda bisa melakukan perubahan itu. Tapi itu agak jauh untuk memperbaiki popup.
zeel
Tidak bekerja untuk saya :(
Phuc Nguyen
0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);
siapa saja
sumber
1
Mengapa Anda membuat skrip seperti ini?
Brad
3
@ siapa saja. Mungkin bermanfaat jika Anda mencoba menjelaskan naskah Anda untuk membantu orang lain mengetahui apa yang mereka lakukan. Ini juga akan memungkinkan Anda menjawab untuk digunakan oleh banyak orang karena sepotong skrip tertentu mungkin dapat diubah dengan cara meningkatkan skrip atau sepotong mungkin dapat digunakan dalam skrip yang sama sekali berbeda. Ini juga merupakan ide yang bagus untuk menjelaskan jawaban Anda untuk membantu orang lain mengetahui bagaimana itu berlaku untuk pertanyaan mereka. Terima kasih telah mengirimkan jawaban Anda.
David
0

Ada alat bagus yang dapat menangani sembulan sembarang gangguan pada sistem Windows - ClickOff . Anda dapat mengunduhnya dari sini . Saya memeriksanya dan berfungsi dengan tanda "Perubahan yang Anda buat mungkin tidak disimpan" untuk situs SharePoint.

Serhiy
sumber