Je souhaite afficher une boîte de dialogue JQuery sous condition lors d'un événement de clic d'un lien hypertexte.
J'ai une exigence comme à condition1 d'ouvrir un dialogue JQuery et si la condition1 n'est pas satisfaite, accédez à la page référencée par la balise 'href' dont l'événement de clic est en question.
Je peux appeler une fonction sur l'événement de clic du lien. Cette fonction vérifie maintenant ladite condition en exécutant une autre URL (qui exécute mon contrôleur Spring et renvoie la réponse).
Tout fonctionne parfaitement avec seulement window.open étant bloqué par le bloqueur de popup.
$('a[href*=/viewpage?number]').live('click', function(e) {
e.preventDefault();
redirectionURL = this.href;
pageId= getUrlVars(redirectionURL)["number"];
$.getJSON("redirect/" + pageId, {}, function(status) {
if (status == null) {
alert("Error in verifying the status.");
} else if(!status) {
$("#agreement").dialog("open");
} else {
window.open(redirectionURL);
}
});
});
Si je supprime e.preventDefault();
du code, le bloqueur de popoup ne bloque pas la page, mais pour la condition1, il ouvre alors le dialogue et ouvre la page 'href'.
Si j'en résous un, cela crée un problème pour un autre. Je ne suis pas en mesure de rendre justice aux deux conditions simultanément.
Pouvez-vous m'aider à résoudre ce problème s'il vous plaît?
Une fois que cela est résolu, j'ai un autre problème à résoudre, à savoir la navigation sur l'événement OK du dialogue :)
la source
Réponses:
Les bloqueurs de fenêtres publicitaires ne sont généralement autorisés que
window.open
s'ils sont utilisés pendant le traitement d'un événement utilisateur (comme un clic). Dans votre cas, vous appelezwindow.open
plus tard , pas pendant l'événement, car il$.getJSON
est asynchrone.Vous avez deux options:
Faites autre chose, plutôt que
window.open
.Rendez l'appel ajax synchrone, ce que vous devriez normalement éviter comme la peste car il verrouille l'interface utilisateur du navigateur.
$.getJSON
est équivalent à:... et ainsi vous pouvez rendre votre
$.getJSON
appel synchrone en mappant vos paramètres sur ce qui précède et en ajoutantasync: false
:Encore une fois, je ne préconise pas les appels ajax synchrones si vous pouvez trouver un autre moyen d'atteindre votre objectif. Mais si vous ne pouvez pas, vous y allez.
Voici un exemple de code qui échoue au test en raison de l'appel asynchrone:
Exemple en direct | Source en direct(les liens en direct ne fonctionnent plus en raison des modifications apportées à JSBin)Et voici un exemple qui fonctionne, en utilisant un appel synchrone:
Exemple en direct | Source en direct(les liens en direct ne fonctionnent plus en raison des modifications apportées à JSBin)la source
vous pouvez appeler window.open sans blocage du navigateur uniquement si l'utilisateur effectue directement une action. Le navigateur envoie un indicateur et détermine cette fenêtre ouverte par l'action de l'utilisateur.
Donc, vous pouvez essayer ce scénario:
la source
myWindow.postMessage
) mais à cause de la restriction de Safaris de ne pas exécuter JavaScript en arrière-plan, la fenêtre parente ne peut jamais envoyer ce changement d'emplacement.J'ai eu ce problème et je n'avais pas mon URL prête jusqu'à ce que le rappel renvoie des données. La solution était d'ouvrir une fenêtre vide avant de démarrer le rappel, puis de définir simplement l'emplacement lorsque le rappel revient.
la source
action().then(doWindowOpenThing).catch(doSomethingElseThatDoesntOpenAPopup)
Donc je ne peux pas ouvrir une fenêtre avant la main (pour garder sa référence, etc.) si plus tard je ne l'utilise pas, non?essayez ça, ça marche pour moi,
Est un violon pour cela http://jsfiddle.net/safeeronline/70kdacL4/1/
la source
Windows doit être créé sur la même pile (aka microtask ) que l'événement initié par l'utilisateur, par exemple un rappel de clic - afin qu'ils ne puissent pas être créés plus tard, de manière asynchrone.
Cependant, vous pouvez créer une fenêtre sans URL et vous pouvez ensuite modifier l'URL de cette fenêtre une fois que vous la connaissez , même de manière asynchrone!
Les navigateurs modernes ouvriront la fenêtre avec une page vierge (souvent appelée
about:blank
), et en supposant que votre tâche asynchrone pour obtenir l'URL soit assez rapide, l'UX qui en résulte est généralement bonne. Si vous souhaitez plutôt afficher un message de chargement (ou quoi que ce soit) dans la fenêtre pendant que l'utilisateur attend, vous pouvez utiliser des URI de données .la source
Ce code m'aide. J'espère que cela aidera certaines personnes
la source
Essayez d'utiliser un élément de lien et cliquez dessus avec javascriipt
et le script
Utilisez-le comme ça
la source
L'observation que l'événement devait être initié par l'utilisateur m'a aidé à comprendre la première partie de cela, mais même après cela, Chrome et Firefox ont toujours bloqué la nouvelle fenêtre. La deuxième partie ajoutait target = "_ blank" au lien, qui a été mentionné dans un commentaire.
En résumé: vous devez appeler window.open à partir d'un événement initié par l'utilisateur, dans ce cas en cliquant sur un lien, et ce lien doit avoir target = "_ blank".
Dans l'exemple ci-dessous, le lien utilise class = "button-twitter".
la source
cela a fonctionné pour moi.
la source
J'utilise cette méthode pour éviter le bloqueur de popup dans mon code React. cela fonctionnera également dans tous les autres codes javascript.
Lorsque vous effectuez un appel asynchrone lors d'un événement de clic, ouvrez d'abord une fenêtre vide, puis écrivez l'URL dans celle-ci plus tard, lorsqu'un appel asynchrone se terminera.
en cas de succès de l'appel asynchrone, écrivez ce qui suit
la source