Détecter bloqué popup dans Chrome
Je suis conscient de javascript techniques pour détecter si une fenêtre est bloquée dans les autres navigateurs (comme décrit dans la réponse à cette question). Voici le test de base:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Mais cela ne fonctionne pas dans google Chrome. Le "POPUP BLOQUÉ" l'article n'est jamais atteint lorsque le pop-up est bloqué.
Bien sûr, le test est de travailler à une certaine mesure, étant donné que Chrome ne fait pas de bloquer les pop-up, mais ouvre dans une petite fenêtre réduite dans le coin inférieur droit de listes de "bloqué" popups.
Ce que je voudrais faire est d'être en mesure de dire si le pop-up a été bloqué par google Chrome bloqueur de pop-ups. J'essaie d'éviter la détection de browser en faveur de la détection de fonctionnalité. Est-il un moyen de le faire sans browser sniffing?
Modifier: maintenant, j'ai essayé de faire usage de newWin.outerHeight
, newWin.left
, et d'autres propriétés similaires à accomplir cela. Google Chrome retourne toutes les position et la hauteur des valeurs que 0 lorsque le pop-up est bloqué.
Malheureusement, il renvoie également les mêmes valeurs, même si le pop-up est réellement ouvert pour une durée indéterminée. Après une certaine période magique (un couple de secondes dans mes tests), l'emplacement et la taille de l'information est retourné en tant que valeurs correctes. En d'autres termes, je ne suis toujours pas plus avancés de ce phénomène. Toute aide serait appréciée.
Dernières solutions de InvisibleBacon et Andy ne fonctionnent pas dans google Chrome, 10): "échec pour google chrome" message s'affiche même si le pop-up a été affichée avec succès. Une idée?
Je pense qu'une nouvelle question afin que certaines de ces solutions semblent avoir travaillé avec les premières versions de google Chrome.
Bailey je suis d'accord, mais juste pour être clair, certains d'entre eux ne travaillent dans la version actuelle de Chrome (19). Andrew, l'idée originale de l'aide outerHeight (ou screenX, comme d'autres l'ont suggéré) fonctionne très bien pour moi, combiné avec le setTimeout approche. Mais, oui, en essayant de donner un sens à toutes ces réponses était vraiment déroutant jusqu'à ce que j'ai fait mes propres tests.
Essayez ceci: stackoverflow.com/a/31299484/1927014
OriginalL'auteur Andrew Ensley | 2009-03-20
Vous devez vous connecter pour publier un commentaire.
Bien le "moment magique" dont vous parlez est probablement lorsque le popup DOM a été chargé. Ou bien, il pourrait être quand tout (images, un hors-bord CSS, etc.) a été chargé. Vous pouvez tester facilement par l'ajout d'un très grand graphique de la fenêtre contextuelle (effacer votre cache d'abord!). Si vous étiez à l'aide d'un Framework Javascript comme jQuery (ou quelque chose de similaire), vous pouvez utiliser le prêt() événement (ou quelque chose de similaire) à attendre pour les DOM à la charge avant la vérification de la fenêtre de l'offset. Le danger, c'est que Safari fonctionne la détection dans un conflit avec un autre moyen: le pop-up du DOM ne sera jamais prêt() dans Safari, car il va vous donner un descripteur valide pour la fenêtre que vous essayez de l'ouvrir -- s'il ouvre ou non. (en fait, je crois que votre popup code de test ci-dessus ne fonctionne pas sur safari.)
Je pense que la meilleure chose que vous pouvez faire est d'envelopper votre test dans un setTimeout() et lui donner le popup 3-5 secondes pour le chargement complet avant d'exécuter le test. Il n'est pas parfait, mais il devrait fonctionner au moins 95% du temps.
Voici le code que j'utilise pour la croix-détection du navigateur, sans le Chrome de la partie.
Ce que je fais est de lancer ce test de la mère et de l'envelopper dans un setTimeout(), en lui donnant la fenêtre enfant de 3 à 5 secondes pour charger. Dans la fenêtre enfant, vous devez ajouter une fonction de test:
function test() {}
Le bloqueur de popup détecteur de tests pour voir si la fonction "test" existe en tant que membre de la fenêtre enfant.
AJOUTÉ LE 15 JUIN 2015:
Je pense que la façon moderne de gérer ce qui serait d'utiliser la fenêtre.postMessage() pour avoir l'enfant en informer le parent que la fenêtre a été chargé. L'approche est similaire (enfant dit parent, il est chargé), mais les moyens de communication s'est améliorée. J'ai été capable de faire ce cross-domain de l'enfant:
Le parent est à l'écoute de ce message à l'aide de:
Espère que cette aide.
Toutes les mises à jour sur ce point? Ne semble pas fonctionner... en particulier dans Chrome
Je crois que j'ai trouvé un moyen de faire ce travail pour les nouvelles versions de google Chrome. Voir ma réponse pour plus de détails.
Fondamentalement, il y a un bug dans Chrome. Bien qu'il masque le message, il s'exécute encore et vous obtenez toujours l'objet de la fenêtre vers l'arrière de manière régulière des contrôles ne fonctionnent pas. Voici la solution qui a fonctionné pour moi: var popup = window.open(url); if (popup) { popup.onload = function () { console.journal(popup.innerHeight > 0 ? 'open' : 'bloqué'); } } else { console.log ("bloqué");} exemple ici: jsbin.com/uticev/3
Cette réponse n'est plus correct, remplacez @Predrag Stojadinović 's réponse
OriginalL'auteur Ringo
Juste une amélioration à InvisibleBacon de snipet (testé dans IE9, Safari 5, Chrome 9 et FF 3.6):
À l'aide de jQuery, au lieu de onload, je ferais $(myPopup).ready(). S'exécutant localement mon IE était trop rapide, et le "onload" avait déjà eu lieu.
OriginalL'auteur Andy
Ce qui suit est une jQuery solution bloqueur de popup de vérification. Il a été testé dans FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9). Mise à jour le _displayError fonction pour gérer le message d'erreur que vous voyez l'ajustement.
Utilisation:
Espérons que cette aide! 🙂
Votre accueil Suvendu, je suis content que vous avez trouvé utile! Amusez-vous bien! 🙂
J'ai modifié ce code pour passer dans/autour de l'url qui est d'essayer d'être ouvert. Cela permet à l'_displayError() la méthode pour afficher un message d'alerte (je suis en utilisant toastr) pour avertir l'utilisateur qu'il y a un problème et de fournir un lien cliquable qui permettra de contourner la plupart des bloqueurs car c'est un lien direct. Merci pour le partage!!
avez-vous plus d'infos à propos de votre solution? Aimerais être en mesure de fournir un lien cliquable directement sur le contenu.
Voici l'essentiel j'ai juste créé pour démontrer mon code modifié et comment je vais l'appeler. Espérons que cela aide! gist.github.com/tylerforsythe/452ceaad62f507d7cb7bd7ddbffe650c
OriginalL'auteur Kevin B
Riche de réponse n'est pas d'aller travailler plus pour google Chrome. Ressemble à Chrome exécute le code Javascript dans la fenêtre pop-up maintenant. J'ai fini de vérifier l'screenX valeur de 0 à vérifier pour le blocage des fenêtres pop-up. Je pense aussi que j'ai trouvé un moyen de garantir que cette propriété est final avant de vérifier. Cela ne fonctionne que pour les popups sur votre domaine, mais vous pouvez ajouter un gestionnaire onload comme ceci:
Comme beaucoup l'ont signalé, le "screenX de la propriété", parfois les rapports non nulle en cas d'échec des fenêtres pop-up, même après onload. J'ai connu ce problème, mais si vous ajoutez le contrôle après un zéro ms temporisation, la screenX propriété semble toujours à la sortie d'une valeur cohérente.
Laissez-moi savoir si il ya des façons de rendre ce script plus robuste. Semble fonctionner pour mes besoins, mais.
Il n'est pas pour moi,
onload
se déclenche jamais.OriginalL'auteur InvisibleBacon
Cela a fonctionné pour moi:
La outerHeight et outerWidth sont pour chrome parce que le "about:blank" truc à partir de ci-dessus ne fonctionne pas sous chrome plus.
Le outerWidth et outerHeight ne fonctionne pas dans Chrome plus
Je suppose qu'ils ont appris à développer à partir de l'IE des gens.......
OriginalL'auteur Predrag Stojadinović
Je vais juste copier/coller la réponse ici: https://stackoverflow.com/a/27725432/892099 par DanielB . fonctionne sur chrome 40, et c'est très propre. pas de sale hacks ou en attente implique.
OriginalL'auteur Hamy
De vérifier la position de la fenêtre par rapport à la mère. Chrome rend la fenêtre apparaissent presque hors de l'écran.
Google Chrome rapports de gauche, et en haut des décalages de 0 lorsque le pop-up est "bloqué". Je pensais que c'était mon billet d'or, mais non. Il rapporte les décalages 0 immédiatement après l'ouvrir réellement ainsi. À un certain moment magique dans l'avenir après l'ouverture, le haut et de gauche, les décalages sont déclarés correctement.
Vérifier mon post par un chemin qui semble garantir que les décalages sont mis en avant de vérifier.
OriginalL'auteur Jason Cohen
J'ai eu un problème similaire avec des popups de ne pas ouvrir dans google Chrome. J'étais frustré parce que je n'étais pas en train de faire quelque chose de sournois, comme un onload popup, juste l'ouverture d'une fenêtre lorsque l'utilisateur a cliqué. J'ai été DOUBLEMENT frustré, car l'exécution de ma fonction qui inclus la fenêtre.open() de l'firebug ligne de commande a fonctionné, alors qu'en fait en cliquant sur mon lien n'a pas! C'était ma solution:
Mauvais sens: l'exécution de la fenêtre.open() à partir d'un écouteur d'événement (dans mon cas, dojo.se connecter à l'événement onclick de la méthode d'un nœud DOM).
Droit chemin: attribution d'une fonction à la propriété onclick du nœud que l'on appelle la fenêtre.open().
Et, bien sûr, je peux toujours faire des écouteurs d'événement pour le même événement onclick si j'en ai besoin. Avec ce changement, j'ai pu ouvrir mes fenêtres, même si google Chrome a été mis à "Ne pas autoriser les sites à afficher des fenêtres pop-ups". De la joie.
Si quelqu'un sage dans les voies de Chrome peut dire que le reste d'entre nous pourquoi cela fait une différence, je serais ravi de l'entendre, bien que je soupçonne que c'est juste une tentative de fermer la porte malveillants programmatique popups.
OriginalL'auteur Chris
Voici une version qui est actuellement en train de travailler dans google Chrome. Juste une petite modification à l'écart entre les Riches et la solution, mais j'ai ajouté dans un wrapper qui gère le timing trop.
L'utiliser simplement faire ceci:
Si le pop-up est bloqué, le message d'alerte s'affichera après le 5 seconde période de grâce (vous pouvez régler cela, mais 5 secondes doit être tout à fait sûr).
OriginalL'auteur Kandelon
Ce fragment intègre tous les ci - dessus, Pour quelque raison - StackOverflow est l'exclusion de la première et la dernière lignes de code dans le bloc de code ci-dessous, j'ai donc écrit un blog sur elle. Pour une explication complète et le reste de l' (téléchargeable) code ont un coup d'oeil à
mon blog à l'thecodeabode.blogspot.com
OriginalL'auteur Ben
Wow il sont beaucoup de solutions ici. C'est la mienne, il utilise des solutions prises à partir de la actuel a accepté de répondre à (qui ne fonctionne pas dans le dernier Chrome et nécessite l'enveloppant dans un délai), ainsi qu'une solution liée à la sur ce fil (qui est en fait la vanille JS, pas jQuery).
Mine utilise un rappel de l'architecture qui sera envoyé
true
lorsque le pop-up est bloqué etfalse
autrement.OriginalL'auteur pospi
Un
Promise
approche ?Et vous pouvez l'utiliser comme le classique
window.open
Vous pouvez modifier le code pour qu'il l'échec de la promesse, au lieu de retourner
undefined
, j'ai juste pensé queif
était plus facile de contrôler le flux detry /catch
pour ce cas.OriginalL'auteur kigiri
Jason réponse est la seule méthode que je pense aussi, mais en s'appuyant sur la position comme ça, c'est un peu douteux!
Ces jours, vous n'avez pas vraiment besoin de poser la question “a mon non sollicités popup bloqué?”, parce que la réponse est invariablement “oui” — tous les principaux navigateurs ont le bloqueur de popup activé par défaut. La meilleure approche est toujours à la fenêtre.open() en réponse à un clic direct, ce qui est presque toujours autorisés.
OriginalL'auteur bobince
HI
J'ai modifié les solutions décrites ci-dessus légèrement et je pense que c'est de travailler pour google Chrome au moins.
Ma solution est faite pour détecter si la pop-up est bloqué lorsque la page est ouverte, et non pas lorsque le popup est ouvert, mais je suis sûr qu'il ya des gens qui peuvent le modifier.:-)
L'inconvénient ici est que la fenêtre contextuelle s'affiche pour un couple de secondes (peut-être possible de raccourcir un peu) quand il n'y a pas de pop-up blocker.
J'ai mis cela dans la section de mon "main" de la fenêtre de
La popuptest ressemble à ceci:
Que j'appelle le test de fonction sur la fenêtre de la page, après 3500 ms la innerheight a été réglé correctement par google Chrome.
- Je utiliser la variable popUpsBlocked de savoir si les messages sont affichés ou non dans d'autres scripts javascript.
j'.e
OriginalL'auteur Lars
OriginalL'auteur syed
Aussi loin que je peux dire (de ce que j'ai testé) Chrome retourne un objet de la fenêtre à l'emplacement de "about:blank".
Donc, la suivante devrait fonctionner pour tous les navigateurs:
OriginalL'auteur Yoav Aharoni