Kadang-kadang, saya menemukan halaman web yang mencoba membuka jendela baru (untuk input pengguna, atau sesuatu yang penting), tetapi pemblokir popup mencegah hal ini terjadi.
Metode apa yang dapat digunakan jendela panggilan untuk memastikan jendela baru diluncurkan dengan benar?
Saya mencoba beberapa contoh di atas, tetapi saya tidak bisa membuatnya bekerja dengan Chrome. Pendekatan sederhana ini tampaknya bekerja dengan Chrome 39, Firefox 34, Safari 5.1.7, dan IE 11. Ini adalah potongan kode dari perpustakaan JS kami.
sumber
Pembaruan: Popup ada dari zaman yang sangat kuno. Gagasan awal adalah menampilkan konten lain tanpa menutup jendela utama. Sampai sekarang, ada cara lain untuk melakukan itu: JavaScript dapat mengirim permintaan ke server, sehingga popup jarang digunakan. Namun terkadang mereka masih berguna.
Di masa lalu situs jahat popups banyak disalahgunakan. Halaman yang buruk bisa membuka banyak jendela sembul dengan iklan. Jadi sekarang sebagian besar peramban mencoba memblokir popup dan melindungi pengguna.
Sebagian besar browser memblokir popup jika mereka dipanggil di luar event handler yang dipicu pengguna seperti onclick.
Jika Anda memikirkannya, itu agak sulit. Jika kodenya secara langsung ada di handler onclick, maka itu mudah. Tetapi popup apa yang terbuka di setTimeout?
Coba kode ini:
Munculan terbuka di Chrome, tetapi diblokir di Firefox.
... Dan ini juga berfungsi di Firefox:
Perbedaannya adalah bahwa Firefox memperlakukan batas waktu 2000 ms atau kurang dapat diterima, tetapi setelah itu - menghapus "kepercayaan", dengan asumsi bahwa sekarang ini "di luar tindakan pengguna". Jadi yang pertama diblokir, dan yang kedua tidak.
Jawaban asli yang terkini 2012:
Semoga ini membantu! :)
sumber
Content-Disposition: attachment;
di header respons), popup akan segera ditutup, karena itusetTimeout
kode akan gagal, dan browser akan mengeluh bahwa "Pemblokir Popup diaktifkan!". Untuk Chrome, saya merekomendasikan solusi @ DanielB dan ini berfungsi dengan baik.Content-Disposition: attachment;
tajuk, Anda tidak perlu membukanya di sembulan. Cukup buat tautan langsung ke aset yang ingin Anda unduh dan perilaku asli browser akan memungkinkan Anda untuk mengunduh tanpa mengarahkan Anda menjauh dari halaman saat ini.window.location
untuk itu, jika file pertama terlalu lama untuk menghasilkan, itu akan diabaikan ketika permintaan kedua dimulai. Itulah alasan mengapa saya harus menggunakanwindow.open
, karenawindow.location
tidak pernah memberi tahu saya ketika respons selesai.Salah satu "solusi" yang akan selalu berfungsi terlepas dari perusahaan atau versi peramban adalah dengan cukup menaruh pesan peringatan di layar, di suatu tempat dekat dengan kontrol yang akan membuat pop-up, yang dengan sopan memperingatkan pengguna bahwa tindakan memerlukan pop-up dan untuk mengaktifkannya untuk situs tersebut.
Saya tahu ini tidak mewah atau apa pun, tetapi tidak bisa lebih sederhana dan hanya membutuhkan sekitar 5 menit pengujian, maka Anda dapat beralih ke mimpi buruk lainnya.
Setelah pengguna mengizinkan pop-up untuk situs Anda, itu juga akan menjadi pertimbangan jika Anda tidak berlebihan pop-up. Hal terakhir yang ingin Anda lakukan adalah mengganggu pengunjung Anda.
sumber
Saya menggabungkan solusi @Kevin B dan @ DanielB.
Ini jauh lebih sederhana.
Pemakaian:
sumber
isPopupBlockerActivated
fungsi tidak pernah kembali aktifreturn (popupWindow.innerHeight > 0) === false;
. Anda berfungsi mengembalikan false ketika browser Anda bukan Chrome. Karena onload adalah proses asinkron. Fungsi Anda mengembalikan false dan kemudian memuat dijalankan, tetapi hasilnya tidak pernah kembali.Saya sudah mencoba banyak solusi, tetapi satu-satunya yang bisa saya gunakan yang juga bekerja dengan uBlock Origin, adalah dengan menggunakan batas waktu untuk memeriksa status popup yang tertutup.
Jelas ini adalah hack; seperti semua solusi untuk masalah ini.
Anda perlu menyediakan waktu yang cukup di setTimeout Anda untuk memperhitungkan pembukaan dan penutupan awal, sehingga tidak akan pernah sepenuhnya akurat. Ini akan menjadi posisi coba-coba.
Tambahkan ini ke daftar upaya Anda.
sumber
Pendekatan sederhana jika Anda memiliki kode anak juga, akan membuat variabel sederhana dalam html-nya seperti di bawah ini:
Dan kemudian periksa keberadaannya dari induknya sesuatu yang mirip dengan berikut:
Kami menunggu beberapa saat untuk memastikan bahwa halaman web telah dimuat, dan memeriksa keberadaannya. Jelas, jika jendela tidak memuat setelah 1500ms maka variabel akan tetap
undefined
.sumber
Dengan menggunakan onbeforeunload acara, kami dapat memeriksa sebagai berikut
itu akan membuka 2 jendela hitam di latar belakang
fungsi mengembalikan nilai boolean.
sumber