Cegah segala bentuk penyegaran halaman menggunakan jQuery / Javascript

93

Setelah pengguna membuka halaman saya, saya tidak ingin dia menyegarkan halaman.

  1. Kapan saja, pengguna mengklik F5 menekan atau menyegarkan tombol di atas. Dia harus mendapatkan pepatah waspada

    Anda tidak dapat menyegarkan halaman.

  2. Juga jika pengguna membuka tab baru dan mencoba mengakses url yang sama di tab sebelumnya, dia harus mendapat peringatan

    Anda tidak dapat membuka halaman yang sama di 2 tab

Pokoknya saya bisa melakukan ini menggunakan JavaScript atau jQuery? Poin satu sangat penting.

pankaj
sumber
Anda dapat mendeteksi menggunakan Broadcast Channel API ( developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API ) Dan mengirim pesan untuk berkomunikasi antar tab. MAKA, dengan menggunakan ini Anda dapat mendeteksi banyak tab dengan url yang sama Dan Memblokir tab lain.
aeXuser264

Jawaban:

195

# 1 dapat diimplementasikan melalui window.onbeforeunload.

Sebagai contoh:

<script type="text/javascript">
    window.onbeforeunload = function() {
        return "Dude, are you sure you want to leave? Think of the kittens!";
    }
</script>

Pengguna akan diminta dengan pesan tersebut, dan diberi opsi untuk tetap di halaman atau melanjutkan perjalanan mereka. Ini menjadi lebih umum. Stack Overflow melakukan ini jika Anda mencoba keluar dari halaman saat Anda mengetik kiriman. Anda tidak dapat sepenuhnya menghentikan pengguna untuk memuat ulang, tetapi Anda dapat membuatnya terdengar sangat menakutkan jika mereka melakukannya.

# 2 kurang lebih tidak mungkin. Meskipun Anda melacak sesi dan login pengguna, Anda tetap tidak dapat menjamin bahwa Anda mendeteksi tab kedua dengan benar. Misalnya, mungkin saya membuka satu jendela, lalu menutupnya. Sekarang saya membuka jendela baru. Anda mungkin akan mendeteksinya sebagai tab kedua, meskipun saya sudah menutup yang pertama. Sekarang pengguna Anda tidak dapat mengakses jendela pertama karena mereka menutupnya, dan mereka tidak dapat mengakses jendela kedua karena Anda menolaknya.

Faktanya, sistem online bank saya berusaha keras untuk melakukan # 2, dan situasi yang dijelaskan di atas terjadi sepanjang waktu. Saya biasanya harus menunggu hingga sesi sisi server berakhir sebelum saya dapat menggunakan sistem perbankan lagi.

Seth
sumber
1
Perlu diketahui bahwa acara onbeforeunload tidak tersedia di versi browser Opera.
WillyCornbread
1
Adakah cara untuk melakukan sesuatu jika pengguna memilih untuk tetap berada di laman.
riship89
5
Melakukan trik untuk saya, meskipun Anda harus menggunakan window.addEventListener (lihat developer.mozilla.org/en-US/docs/Web/Events/beforeunload ) sebagai gantinya, untuk kompatibilitas lintas-browser dan untuk mencegah masalah perpustakaan.
Julien Bérubé
Saya tahu pertanyaan ini sudah tua tetapi, jika mereka benar - benar ingin mencegah beberapa sesi, dapatkah mereka menggunakan WebSockets?
Meghan
1
@ Sean - Yup ... jika Anda benar - benar ingin mencegah beberapa sesi. WebSocket dapat melakukan komunikasi dua arah yang stateful. Klien (mungkin) tidak akan tiba-tiba menjadi orang lain saat WebSocket terhubung, jadi Anda harus dapat menetapkan token kepada pengguna tersebut, dan menghapusnya setelah soket ditutup. Tapi, ini meretas perilaku yang diharapkan dari agen pengguna, jadi mungkin UX itu buruk. Saya dapat memikirkan sangat sedikit kasus di mana sesuatu seperti ini akan sesuai (mungkin game online - untuk mencegah seseorang masuk sebagai dua cakar kematian level 37 ...).
Seth
34

Anda tidak dapat mencegah pengguna menyegarkan, Anda juga tidak harus benar-benar mencoba. Anda harus kembali ke mengapa Anda membutuhkan solusi ini, apa akar masalahnya di sini ?. Mulailah dari sana dan temukan cara lain untuk menyelesaikan masalah. Mungkin Anda telah menjelaskan mengapa Anda merasa perlu melakukan ini, ini akan membantu dalam menemukan solusi seperti itu.

Mendobrak fitur peramban fundamental bukanlah ide yang bagus, lebih dari 99.999999999% internet berfungsi dan menyegarkan dengan F5, ini adalah harapan pengguna, yang tidak boleh Anda rusak.

Nick Craver
sumber
Masalahnya adalah, halaman tersebut adalah aplikasi siebel. dan saat pengguna berada dalam satu sesi dan menekan segarkan, sesi baru dibuat, dan aplikasi mogok. jadi saya membutuhkan pengguna agar tidak dapat menyegarkan.
pankaj
20
@pankaj - Itu harus diperbaiki di situs aplikasi, dan cookie misalnya sehingga pengguna berbagi sesi di seluruh tab.
Nick Craver
9
Saya tidak yakin dari mana Anda berasal dari sini. Banyak sekali situs di internet yang mencegah browser menyegarkan jika Anda memiliki formulir yang kotor, mengingatkan Anda bahwa perubahan Anda bisa hilang. Tidak yakin mengapa ini "merusak fitur browser fundamental".
Siraris
1
@Siraris: Tepat. Selain itu, saya membuat aplikasi pribadi yang seharusnya dapat digunakan pengguna bahkan ketika dia tidak berada di jaringan pribadinya. Jadi saya menyimpan semuanya di penyimpanan browser untuk penggunaan offline, tetapi jika dia memuat ulang halaman, seluruh aplikasi hilang. Ini mungkin tidak terlalu "biasa", tetapi di dunia TI modern ini, hal itu akan menjadi lebih dan lebih.
cslotty
16

Meskipun bukan ide yang baik untuk menonaktifkan kunci F5, Anda dapat melakukannya di JQuery seperti di bawah ini.

<script type="text/javascript">
function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };

$(document).ready(function(){
     $(document).on("keydown", disableF5);
});
</script>

Semoga ini bisa membantu!

Nilesh
sumber
28
Bagaimana dengan OSX, di mana CMD + R? Atau ponsel di mana ada tombol untuk ditekan? Saya tidak melihat ini sebagai solusi
ItalyPaleAle
14

Kembali ke masa awal CGI, kami memiliki banyak bentuk yang akan memicu berbagai tindakan backend. Seperti pemberitahuan teks ke grup, pekerjaan cetak, pengumpulan data, dll.

Jika pengguna berada di halaman yang mengatakan "Harap tunggu ... Melakukan beberapa pekerjaan BESAR yang bisa memakan waktu.". Mereka lebih mungkin untuk melakukan REFRESH dan ini akan menjadi BURUK!

MENGAPA? Karena itu akan memicu pekerjaan yang lebih lambat dan pada akhirnya menghambat semuanya.

Solusinya? Biarkan mereka melakukan bentuk mereka. Ketika mereka mengirimkan formulir mereka ... Mulailah pekerjaan Anda dan kemudian arahkan mereka ke halaman lain yang memberitahu mereka untuk menunggu.

Dimana halaman di tengah sebenarnya menyimpan formulir data yang dibutuhkan untuk memulai pekerjaan. Namun halaman WAIT berisi riwayat javascript yang dihancurkan. Jadi mereka dapat MEMBUANGKAN halaman tunggu itu semau mereka dan itu tidak akan memicu pekerjaan asli untuk dimulai di latar belakang karena halaman WAIT itu hanya berisi data formulir yang diperlukan untuk WAIT itu sendiri.

Harapan itu masuk akal.

Fungsi penghancuran riwayat juga mencegah mereka mengklik KEMBALI dan kemudian menyegarkan juga.

Itu sangat mulus dan bekerja dengan baik selama BANYAK tahun sampai organisasi nirlaba ditutup.

Contoh: FORMULIR MASUK - Kumpulkan semua info mereka dan ketika dikirim, ini memicu pekerjaan backend Anda.

RESPONS dari entri formulir - Mengembalikan HTML yang melakukan pengalihan ke halaman tunggu statis Anda dan / atau POST / GET ke formulir lain (halaman WAIT).

HALAMAN TUNGGU - Hanya berisi FORM data yang terkait dengan halaman tunggu serta javascript untuk menghancurkan history terbaru. Suka (-1 ATAU -2) untuk hanya menghancurkan halaman terbaru, tetapi tetap memungkinkan mereka untuk kembali ke halaman entri FORM aslinya.

Setelah mereka berada di halaman TUNGGU Anda, mereka dapat mengklik REFRESH sebanyak yang mereka inginkan dan itu tidak akan pernah memunculkan pekerjaan FORM asli di backend. Sebagai gantinya, halaman WAIT Anda harus merangkul META waktunya refresh itu sendiri sehingga selalu dapat memeriksa status pekerjaan mereka. Ketika pekerjaan mereka selesai, mereka dialihkan dari halaman tunggu ke mana pun Anda inginkan.

Jika mereka melakukan REFRESH secara manual ... Mereka hanya menambahkan satu cek lagi dari status pekerjaan mereka di sana.

Semoga membantu. Semoga berhasil.

Todd
sumber
2
Anda tidak mendapatkan cukup pujian untuk jawaban yang luar biasa dan informatif ini. Terima kasih!!
ShiningLight
2

Angka (2) dimungkinkan dengan menggunakan implementasi soket (seperti websocket, socket.io, dll.) Dengan detak jantung khusus untuk setiap sesi yang melibatkan pengguna. Jika pengguna mencoba membuka jendela lain, Anda memiliki pemeriksaan penangan javascript dengan server jika tidak apa-apa, lalu tanggapi dengan pesan kesalahan.

Namun, solusi yang lebih baik adalah menyinkronkan kedua sesi jika memungkinkan seperti di Google Docs.

seo
sumber
2

Masalah # 2 sekarang dapat diselesaikan menggunakan BroadcastAPI .

Saat ini hanya tersedia di Chrome, Firefox, dan Opera.

var bc = new BroadcastChannel('test_channel');

bc.onmessage = function (ev) { 
    if(ev.data && ev.data.url===window.location.href){
       alert('You cannot open the same page in 2 tabs');
    }
}

bc.postMessage(window.location.href);
RockLegend
sumber