Je développe un flux d'authentification OAuth purement en JavaScript et je souhaite montrer à l'utilisateur la fenêtre "Accorder l'accès" dans une fenêtre contextuelle, mais elle est bloquée.
Comment puis-je empêcher les fenêtres pop-up créées par l'un window.open
ou l' autre ou window.showModalDialog
d'être bloquées par les bloqueurs de fenêtres pop-up des différents navigateurs?
javascript
popup
modal-dialog
popup-blocker
Pablo Fernandez
la source
la source
Réponses:
La règle générale est que les bloqueurs de popups s'engageront si
window.open
ou similaire est invoqué à partir de javascript qui n'est pas invoqué par une action directe de l'utilisateur . Autrement dit, vous pouvez appelerwindow.open
en réponse à un clic sur un bouton sans être touché par le bloqueur de fenêtres contextuelles, mais si vous mettez le même code dans un événement de minuterie, il sera bloqué. La profondeur de la chaîne d'appels est également un facteur - certains navigateurs plus anciens ne regardent que l'appelant immédiat, les nouveaux navigateurs peuvent revenir un peu en arrière pour voir si l'appelant de l'appelant était un clic de souris, etc.la source
Sur la base de Jason Sebring est astuce très utile , et sur les choses couvertes ici et là , je trouve une solution parfaite pour mon cas:
Pseudo code avec des extraits de code Javascript:
créer immédiatement une fenêtre contextuelle vide sur l'action de l'utilisateur
Facultatif: ajoutez un message d'information "en attente". Exemples:
a) Une page HTML externe: remplacez la ligne ci-dessus par
b) Texte: ajoutez la ligne suivante sous celle ci-dessus:
le remplir de contenu lorsque vous êtes prêt (lorsque l'appel AJAX est renvoyé, par exemple)
Enrichissez l'appel à
window.open
avec toutes les options supplémentaires dont vous avez besoin.J'utilise en fait cette solution pour une redirection mailto, et cela fonctionne sur tous mes navigateurs (windows 7, Android). le
_blank
bit permet à la redirection mailto de fonctionner sur mobile, btw.Ton expérience? Un moyen d'améliorer cela?
la source
Whatever it is you intend to do, there is a better way than a popup window
lol? Généralisation étrange. Le client souhaite que la page sur laquelle il s'est authentifié reste ouverte et que le nouveau site / page de destination après l'authentification s'ouvre dans un nouvel onglet. Oui, ce n'est pas mon idée d'une excellente expérience utilisateur ... mais cela semble raisonnableimportantStuff.close
pour fermer le nouvel onglet et fournir une alerte dans la page d'origine.De plus Swiss Mister post, dans mon cas, le window.open a été lancé à l'intérieur d'une promesse, ce qui a activé le bloqueur de popup, ma solution était: en angulaire:
browserService:
c'est ainsi que vous pouvez ouvrir un nouvel onglet en utilisant la réponse de promesse et sans invoquer le bloqueur de popup.
la source
const tab = window.open(); observable.subscribe(dataUrl => tab.location.href = dataUrl);
.then
réponse sur alors et c'est pourquoi je suis si confus: / SRY ...En tant que bonne pratique, je pense que c'est une bonne idée de tester si une fenêtre contextuelle a été bloquée et de prendre des mesures au cas où. Vous devez savoir que window.open a une valeur de retour et que cette valeur peut être nulle si l'action échoue. Par exemple, dans le code suivant:
si le popup est bloqué, window.open renverra null. La fonction retournera donc false.
Si la fenêtre contextuelle ne s'ouvre pas, vous pouvez:
la source
de l'API JavaScript oauth de Google:
http://code.google.com/p/google-api-javascript-client/wiki/Authentication
Voir la zone où il se lit:
Configuration de l'authentification
L'implémentation d'OAuth 2.0 par le client utilise une fenêtre contextuelle pour inviter l'utilisateur à se connecter et à approuver l'application. Le premier appel à gapi.auth.authorize peut déclencher des bloqueurs de popup, car il ouvre indirectement la fenêtre popup. Pour empêcher le bloqueur de popup de se déclencher sur les appels d'authentification, appelez gapi.auth.init (rappel) lorsque le client se charge. Le rappel fourni sera exécuté lorsque la bibliothèque sera prête à effectuer des appels d'authentification.
Je suppose que c'est lié à la vraie réponse ci-dessus dans la façon dont il explique s'il y a une réponse immédiate, il ne déclenchera pas l'alarme contextuelle. Le "gapi.auth.init" fait en sorte que l'API se produise immédiatement.
Application pratique
J'ai créé un microservice d'authentification open source en utilisant le passeport de nœud sur npm et les différents packages de passeport pour chaque fournisseur. J'ai utilisé une approche de redirection standard vers le tiers en lui donnant une URL de redirection vers laquelle revenir. C'était programmatique, donc je pouvais avoir différents endroits vers lesquels rediriger en cas de connexion / inscription et sur des pages particulières.
github.com/sebringj/athu
passeportjs.org
la source
J'ai essayé plusieurs solutions, mais c'est la seule qui a fonctionné pour moi dans tous les navigateurs
let newTab = window.open(); newTab.location.href = url;
la source
url
? il n'est pas attribué.http://example.com
window.open()
ne peut pas ouvrir une nouvelle fenêtre par programme et si nous en avons besoin, cette réponse est l'une des options. Avec lanewTab
variable à laquelle nous faisons référencewindow.open()
et plus tard, nous pouvons l'appeler, insérer l'url
URL dont nous avons besoin, dans mon cas, l'url d'un objet blob, et le nouvel onglet sera ouvert avec l'url saisie.Je ne voulais pas créer la nouvelle page à moins que le rappel ne soit retourné avec succès, j'ai donc fait ceci pour simuler le clic de l'utilisateur:
la source
Le moyen le plus simple de s'en débarrasser est de:
Ex:
Cela a très bien fonctionné pour moi. À votre santé
la source