Parfois, je suis tombé sur une page Web qui tente d'ouvrir une nouvelle fenêtre (pour l'entrée de l'utilisateur ou quelque chose d'important), mais le bloqueur de fenêtres contextuelles empêche cela de se produire.
Quelles méthodes la fenêtre d'appel peut-elle utiliser pour s'assurer que la nouvelle fenêtre s'est lancée correctement?
J'ai essayé plusieurs des exemples ci-dessus, mais je n'ai pas pu les faire fonctionner avec Chrome. Cette approche simple semble fonctionner avec Chrome 39, Firefox 34, Safari 5.1.7 et IE 11. Voici l'extrait de code de notre bibliothèque JS.
la source
Mise à jour: les pop-ups existent depuis des temps très anciens. L'idée initiale était d'afficher un autre contenu sans fermer la fenêtre principale. À partir de maintenant, il existe d'autres moyens de le faire: JavaScript est capable d'envoyer des requêtes pour le serveur, les popups sont donc rarement utilisés. Mais parfois, ils sont toujours utiles.
Dans le passé, les sites malveillants ont beaucoup abusé des popups. Une mauvaise page pourrait ouvrir des tonnes de fenêtres contextuelles avec des publicités. Alors maintenant, la plupart des navigateurs essaient de bloquer les popups et de protéger l'utilisateur.
La plupart des navigateurs bloquent les fenêtres contextuelles si elles sont appelées en dehors des gestionnaires d'événements déclenchés par l'utilisateur comme onclick.
Si vous y réfléchissez, c'est un peu délicat. Si le code est directement dans un gestionnaire onclick, c'est facile. Mais qu'est-ce que le popup s'ouvre dans setTimeout?
Essayez ce code:
La fenêtre contextuelle s'ouvre dans Chrome, mais est bloquée dans Firefox.
… Et cela fonctionne aussi dans Firefox:
La différence est que Firefox traite un délai d'expiration de 2000 ms ou moins est acceptable, mais après cela - supprime la «confiance», en supposant que maintenant c'est «en dehors de l'action de l'utilisateur». Ainsi, le premier est bloqué, et le second ne l'est pas.
Réponse originale qui était en cours en 2012:
J'espère que cela t'aides! :)
la source
Content-Disposition: attachment;
dans l'en-tête de la réponse), la popup se fermera immédiatement, donc lesetTimeout
code échouera, et le navigateur se plaindra que "Popup Blocker est activé!". Pour Chrome, je recommande la solution de @ DanielB et cela fonctionne très bien.Content-Disposition: attachment;
tête, vous n'avez pas besoin de l'ouvrir dans une fenêtre contextuelle. Créez simplement un lien direct vers l'actif que vous souhaitez télécharger et le comportement natif du navigateur vous permettra de télécharger sans vous rediriger hors de la page en cours.window.location
, si le premier fichier prend trop de temps à générer, il sera ignoré au démarrage de la deuxième requête. C'est la raison pour laquelle je dois utiliserwindow.open
, carwindow.location
ne me fait jamais savoir quand la réponse se termine.Une «solution» qui fonctionnera toujours quelle que soit la société ou la version du navigateur consiste simplement à mettre un message d'avertissement à l'écran, quelque part près du contrôle qui créera une fenêtre contextuelle, qui avertit poliment l'utilisateur que l'action nécessite un pop- et de les activer pour le site.
Je sais que ce n'est pas de la fantaisie ou quoi que ce soit, mais cela ne peut pas être plus simple et ne nécessite que 5 minutes de test, alors vous pouvez passer à d'autres cauchemars.
Une fois que l'utilisateur a autorisé les pop-ups pour votre site, il serait également prudent de ne pas en faire trop. La dernière chose que vous voulez faire est d'ennuyer vos visiteurs.
la source
J'ai combiné les solutions @Kevin B et @ DanielB.
C'est beaucoup plus simple.
Usage:
la source
isPopupBlockerActivated
la fonction ne revient jamaisreturn (popupWindow.innerHeight > 0) === false;
. Votre fonction renvoie false lorsque votre navigateur n'est pas Chrome. Parce que le chargement est un processus asynchrone. Votre fonction retourne false puis onload exécuté mais son résultat ne revient jamais.J'ai essayé beaucoup de solutions, mais la seule que j'ai pu proposer qui fonctionnait également avec uBlock Origin, était d'utiliser un délai d'attente pour vérifier l'état fermé de la fenêtre contextuelle.
De toute évidence, c'est un hack; comme toutes les solutions à ce problème.
Vous devez prévoir suffisamment de temps dans votre setTimeout pour tenir compte de l'ouverture et de la fermeture initiales, donc cela ne sera jamais complètement précis. Ce sera une position d'essais et d'erreurs.
Ajoutez ceci à votre liste de tentatives.
la source
Une approche simple si vous possédez également le code enfant serait de créer une variable simple dans son html comme ci-dessous:
Et puis vérifiez son existence du parent quelque chose de similaire à ce qui suit:
Nous attendons un certain temps pour nous assurer que la page Web a été chargée et vérifier son existence. Évidemment, si la fenêtre ne se chargeait pas après 1500 ms, la variable le serait toujours
undefined
.la source
En utilisant l'événement onbeforeunload, nous pouvons vérifier comme suit
il ouvrira 2 fenêtres noires en arrière-plan
la fonction renvoie une valeur booléenne.
la source