Saya sedang mengembangkan alur otentikasi OAuth murni dalam JavaScript dan saya ingin menunjukkan kepada pengguna jendela "beri akses" dalam sembulan, tetapi diblokir.
Bagaimana saya bisa mencegah jendela sembulan yang dibuat oleh window.open
atau window.showModalDialog
diblokir oleh pemblokir pop-up browser yang berbeda?
javascript
popup
modal-dialog
popup-blocker
Pablo Fernandez
sumber
sumber
Jawaban:
Aturan umum adalah bahwa pemblokir popup akan terlibat jika
window.open
atau serupa dipanggil dari javascript yang tidak dipanggil oleh tindakan pengguna langsung . Artinya, Anda dapat meneleponwindow.open
sebagai respons terhadap klik tombol tanpa terkena popup blocker, tetapi jika Anda memasukkan kode yang sama dalam acara penghitung waktu, itu akan diblokir. Kedalaman rantai panggilan juga merupakan faktor - beberapa browser lama hanya melihat penelepon langsung, browser yang lebih baru dapat mundur sedikit untuk melihat apakah penelepon penelepon adalah klik mouse, dll. Simpan semurah mungkin untuk menghindari pemblokir popup.sumber
Berdasarkan Jason Sebring Ini tip yang sangat berguna , dan pada hal-hal yang dibahas di sini dan di sana , saya menemukan solusi sempurna untuk kasus saya:
Kode semu dengan cuplikan Javascript:
segera buat popup kosong pada aksi pengguna
Opsional: tambahkan beberapa pesan info "menunggu". Contoh:
a) Halaman HTML eksternal: ganti baris di atas dengan
b) Teks: tambahkan baris berikut di bawah yang di atas:
isi dengan konten saat siap (ketika panggilan AJAX dikembalikan, misalnya)
Perkaya panggilan untuk
window.open
dengan opsi tambahan apa pun yang Anda butuhkan.Saya sebenarnya menggunakan solusi ini untuk pengalihan mailto, dan itu berfungsi pada semua browser saya (windows 7, Android). Itu
_blank
bit membantu untuk mailto redirection untuk bekerja pada ponsel, btw.Pengalamanmu? Adakah cara untuk meningkatkan ini?
sumber
Whatever it is you intend to do, there is a better way than a popup window
lol? Generalisasi ganjil. Klien ingin halaman yang diautentikasi agar tetap terbuka, dan halaman situs / pendaratan baru setelah otentikasi dibuka di tab baru. Ya, bukan ide saya tentang pengalaman pengguna yang sangat baik ... tetapi tampaknya masuk akalimportantStuff.close
untuk menutup tab baru dan berikan dan beri tahu di halaman asli.Selain posting Swiss Mister, dalam kasus saya window.open diluncurkan di dalam janji, yang mengaktifkan pemblokir popup, solusi saya adalah: dalam sudut:
layanan browser:
ini adalah bagaimana Anda dapat membuka tab baru menggunakan respons janji dan tidak memanggil pemblokir popup.
sumber
const tab = window.open(); observable.subscribe(dataUrl => tab.location.href = dataUrl);
.then
jawaban saat itu dan itulah sebabnya saya jadi bingung: / SRY ...Sebagai praktik yang baik, saya pikir itu ide yang baik untuk menguji apakah popup diblokir dan mengambil tindakan untuk berjaga-jaga. Anda perlu tahu bahwa window.open memiliki nilai kembali, dan nilai itu mungkin nol jika tindakan gagal. Misalnya, dalam kode berikut:
jika popup diblokir, window.open akan mengembalikan nol. Jadi fungsinya akan mengembalikan false.
Jika popup tidak terbuka, Anda dapat:
sumber
dari API JavaScript Google oauth:
http://code.google.com/p/google-api-javascript-client/wiki/Authentication
Lihat area di mana tertulis:
Menyiapkan Otentikasi
Implementasi klien dari OAuth 2.0 menggunakan jendela sembulan untuk meminta pengguna untuk masuk dan menyetujui aplikasi. Panggilan pertama ke gapi.auth.authorize dapat memicu pemblokir popup, karena membuka jendela popup secara tidak langsung. Untuk mencegah pemblokir popup memicu panggilan auth, panggil gapi.auth.init (panggilan balik) saat klien memuat. Callback yang disediakan akan dieksekusi ketika perpustakaan siap untuk melakukan panggilan auth.
Saya kira itu berkaitan dengan jawaban nyata di atas dalam cara menjelaskan jika ada tanggapan langsung, itu tidak akan trip alarm popup. "Gapi.auth.init" membuatnya sehingga api segera terjadi.
Aplikasi praktis
Saya membuat microservice otentikasi open source menggunakan paspor simpul pada npm dan berbagai paket paspor untuk setiap penyedia. Saya menggunakan pendekatan pengalihan standar ke pihak ke-3 yang memberikan URL pengalihan untuk kembali ke. Ini terprogram sehingga saya dapat memiliki tempat yang berbeda untuk mengarahkan kembali ke jika login / mendaftar dan pada halaman tertentu.
github.com/sebringj/athu
passportjs.org
sumber
Saya mencoba beberapa solusi, tetapi hanya dia yang benar-benar bekerja untuk saya di semua browser
let newTab = window.open(); newTab.location.href = url;
sumber
url
? itu tidak ditugaskan.http://example.com
window.open()
tidak dapat membuka jendela baru secara terprogram dan jika perlu, jawaban itu adalah salah satu opsi. DengannewTab
variabel kita membuat referensiwindow.open()
dan kemudian kita dapat memanggilnya, masukkan yangurl
kita butuhkan, dalam url kasus saya dari beberapa gumpalan, dan tab baru akan dibuka dengan pada url yang dimasukkan.Saya tidak ingin membuat halaman baru kecuali panggilan balik berhasil kembali, jadi saya melakukan ini untuk mensimulasikan klik pengguna:
sumber
Cara termudah untuk menghilangkan ini adalah dengan:
Mis:
Ini bekerja sangat baik untuk saya. Bersulang
sumber