Saya mengetahui teknik javascript untuk mendeteksi apakah munculan diblokir di browser lain (seperti yang dijelaskan dalam jawaban atas pertanyaan ini ). Inilah tes dasarnya:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Tetapi ini tidak berfungsi di Chrome. Bagian "POPUP BLOCKED" tidak pernah dicapai saat popup diblokir.
Tentu saja, pengujian ini bekerja karena Chrome tidak benar-benar memblokir popup, tetapi membukanya di jendela kecil yang diperkecil di sudut kanan bawah yang mencantumkan popup "diblokir".
Yang ingin saya lakukan adalah mengetahui apakah popup diblokir oleh pemblokir popup Chrome. Saya mencoba untuk menghindari browser sniffing yang mendukung deteksi fitur. Adakah cara untuk melakukan ini tanpa mengendus browser?
Mengedit : Saya sekarang mencoba membuat penggunaan newWin.outerHeight
, newWin.left
dan sifat-sifat serupa lainnya untuk mencapai hal ini. Google Chrome mengembalikan semua nilai posisi dan ketinggian sebagai 0 saat popup diblokir.
Sayangnya, itu juga mengembalikan nilai yang sama meskipun popup sebenarnya dibuka untuk jangka waktu yang tidak diketahui. Setelah beberapa periode ajaib (beberapa detik dalam pengujian saya), informasi lokasi dan ukuran dikembalikan sebagai nilai yang benar. Dengan kata lain, saya masih belum bisa memahami hal ini. Bantuan apa pun akan dihargai.
sumber
Jawaban:
Nah, "waktu ajaib" yang Anda bicarakan mungkin adalah ketika DOM munculan telah dimuat. Atau mungkin juga ketika semuanya (gambar, CSS tempel, dll.) Telah dimuat. Anda dapat menguji ini dengan mudah dengan menambahkan grafik yang sangat besar ke popup (bersihkan cache Anda terlebih dahulu!). Jika Anda menggunakan Javascript Framework seperti jQuery (atau yang serupa), Anda dapat menggunakan event ready () (atau yang serupa) untuk menunggu DOM dimuat sebelum memeriksa offset jendela. Bahayanya adalah deteksi Safari bekerja dengan cara yang bertentangan: DOM popup tidak akan pernah siap () di Safari karena ini akan memberi Anda pegangan yang valid untuk jendela yang Anda coba buka - apakah itu benar-benar terbuka atau tidak. (faktanya, saya yakin kode pengujian popup Anda di atas tidak akan berfungsi untuk safari.)
Saya pikir hal terbaik yang dapat Anda lakukan adalah membungkus pengujian Anda dalam setTimeout () dan memberikan popup 3-5 detik untuk menyelesaikan pemuatan sebelum menjalankan pengujian. Ini tidak sempurna, tetapi harus berhasil setidaknya 95% dari waktu.
Berikut kode yang saya gunakan untuk deteksi lintas-browser, tanpa bagian Chrome.
Apa yang saya lakukan adalah menjalankan tes ini dari induk dan membungkusnya dalam setTimeout (), memberikan jendela anak 3-5 detik untuk dimuat. Di jendela anak, Anda perlu menambahkan fungsi pengujian:
uji fungsi () {}
Detektor pemblokir popup menguji apakah fungsi "test" ada sebagai anggota jendela anak.
DITAMBAHKAN 15 JUNI 2015:
Saya pikir cara modern untuk menangani ini akan menggunakan window.postMessage () agar anak memberi tahu orang tua bahwa jendela telah dimuat. Pendekatannya serupa (anak memberi tahu orang tua bahwa itu dimuat), tetapi sarana komunikasi telah meningkat. Saya dapat melakukan ini lintas-domain dari anak:
Orang tua mendengarkan pesan ini menggunakan:
Semoga ini membantu.
sumber
Hanya satu peningkatan pada snipet InvisibleBacon (diuji di IE9, Safari 5, Chrome 9 dan FF 3.6):
sumber
Berikut ini adalah solusi jQuery untuk memeriksa pemblokir popup. Ini telah diuji di FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9). Perbarui fungsi _displayError untuk menangani pesan kesalahan sesuai keinginan Anda.
Pemakaian:
Semoga ini membantu! :)
sumber
Jawaban Rich tidak akan berfungsi lagi untuk Chrome. Sepertinya Chrome benar-benar menjalankan Javascript apa pun di jendela popup sekarang. Saya akhirnya memeriksa nilai screenX 0 untuk memeriksa popup yang diblokir. Saya juga berpikir saya menemukan cara untuk menjamin bahwa properti ini sudah final sebelum diperiksa. Ini hanya berfungsi untuk munculan di domain Anda, tetapi Anda dapat menambahkan penangan onload seperti ini:
Seperti yang telah dilaporkan banyak orang, properti "screenX" terkadang melaporkan bukan nol untuk munculan yang gagal, bahkan setelah dimuat. Saya mengalami perilaku ini juga, tetapi jika Anda menambahkan centang setelah waktu tunggu nol ms, properti screenX sepertinya selalu mengeluarkan nilai yang konsisten.
Beri tahu saya jika ada cara untuk membuat skrip ini lebih kuat. Sepertinya bekerja untuk tujuan saya.
sumber
onload
tidak pernah menyala.Ini berhasil untuk saya:
OuterHeight dan outerWidth adalah untuk chrome karena trik 'about: blank' dari atas tidak berfungsi di chrome lagi.
sumber
Saya hanya akan menyalin / menempel jawaban yang disediakan di sini: https://stackoverflow.com/a/27725432/892099 oleh DanielB. bekerja pada chrome 40 dan sangat bersih. tidak ada hacks kotor atau menunggu melibatkan.
sumber
Bagaimana dengan
Promise
pendekatan?Dan Anda bisa menggunakannya seperti klasik
window.open
Anda dapat mengubah kode sehingga gagal janji alih-alih kembali
undefined
, saya hanya berpikir ituif
adalah aliran kontrol yang lebih mudah daripadatry / catch
untuk kasus ini.sumber
Periksa posisi jendela relatif terhadap induknya. Chrome membuat jendela muncul hampir di luar layar.
sumber
Saya mengalami masalah serupa dengan munculan yang tidak terbuka di Chrome. Saya frustrasi karena saya tidak mencoba melakukan sesuatu yang licik, seperti munculan yang memuat, hanya membuka jendela saat pengguna mengeklik. Saya sangat frustrasi karena menjalankan fungsi saya yang menyertakan window.open () dari baris perintah firebug berfungsi, sementara sebenarnya mengklik tautan saya tidak! Inilah solusi saya:
Salah jalan: menjalankan window.open () dari event listener (dalam kasus saya, dojo.connect ke metode event onclick dari node DOM).
Cara yang benar: menetapkan fungsi ke properti onclick dari node yang disebut window.open ().
Dan, tentu saja, saya masih bisa melakukan pendengar acara untuk acara onclick yang sama jika perlu. Dengan perubahan ini, saya dapat membuka jendela saya meskipun Chrome disetel ke "Jangan izinkan situs apa pun menampilkan munculan". Kegembiraan.
Jika ada yang bijak dalam cara Chrome dapat memberi tahu kita semua mengapa hal itu membuat perbedaan, saya ingin mendengarnya, meskipun saya curiga itu hanya upaya untuk menutup pintu pada sembulan terprogram yang berbahaya.
sumber
Ini adalah versi yang saat ini berfungsi di Chrome. Hanya sedikit perubahan dari solusi Rich, meskipun saya menambahkan pembungkus yang menangani waktu juga.
Untuk menggunakannya, lakukan ini:
Jika popup diblokir, pesan peringatan akan ditampilkan setelah masa tenggang 5 detik (Anda dapat menyesuaikannya, tetapi 5 detik seharusnya cukup aman).
sumber
Fragmen ini menggabungkan semua hal di atas - Untuk beberapa alasan - StackOverflow mengecualikan baris pertama dan terakhir kode di blok kode di bawah ini, jadi saya menulis blog tentang itu. Untuk penjelasan lengkap dan kode (yang dapat diunduh) lainnya, lihat blog saya di thecodeabode.blogspot.com
sumber
Wah pasti ada banyak solusi disini. Ini milik saya, ini menggunakan solusi yang diambil dari jawaban yang diterima saat ini (yang tidak berfungsi di Chrome terbaru dan perlu membungkusnya dalam batas waktu), serta solusi terkait di utas ini (yang sebenarnya adalah vanilla JS, bukan jQuery) .
Milik saya menggunakan arsitektur panggilan balik yang akan dikirim
true
ketika popup diblokir danfalse
sebaliknya.sumber
Jawaban Jason adalah satu-satunya metode yang dapat saya pikirkan juga, tetapi mengandalkan posisi seperti itu agak cerdik!
Saat ini, Anda tidak perlu mengajukan pertanyaan “apakah popup saya yang tidak diminta diblokir?”, Karena jawabannya selalu “ya” - semua browser utama mengaktifkan pemblokir popup secara default. Pendekatan terbaik hanya untuk window.open () sebagai respons terhadap klik langsung, yang hampir selalu diizinkan.
sumber
HAI
Saya sedikit memodifikasi solusi yang dijelaskan di atas dan berpikir bahwa itu berfungsi untuk Chrome setidaknya. Solusi saya dibuat untuk mendeteksi jika popup diblokir ketika halaman utama dibuka, bukan ketika popup dibuka, tetapi saya yakin ada beberapa orang yang dapat memodifikasinya. :-) Kekurangannya di sini adalah jendela popup yang ditampilkan selama beberapa detik (mungkin bisa sedikit dipersingkat) saat tidak ada pemblokir popup.
Saya meletakkan ini di bagian jendela 'utama' saya
Popuptest terlihat seperti ini:
Saat saya memanggil fungsi uji pada halaman popup setelah 3500 ms, ketinggian dalam telah disetel dengan benar oleh Chrome.
Saya menggunakan variabel popUpsBlocked untuk mengetahui apakah popup ditampilkan atau tidak di javascript lain. yaitu
sumber
sumber
Sejauh yang saya tahu (dari apa yang telah saya uji) Chrome mengembalikan objek jendela dengan lokasi 'about: blank'. Jadi, berikut ini seharusnya berfungsi untuk semua browser:
sumber