Chrome window.open après requête ajax agit comme un popup
J'ai une situation où, lorsqu'un utilisateur appuie sur un bouton j'ai effectuer une requête ajax, et puis utiliser le résultat de la requête ajax pour générer une URL qui je veux ouvrir dans un nouvel onglet. Cependant, dans google chrome, quand je l'appelle de la fenêtre.ouvrir dans le gestionnaire de succès de la requête ajax, il s'ouvre dans une nouvelle fenêtre comme un pop-up (et est bloqué par des pop-up blockers). Ma conjecture est que depuis que le code de succès est asynchrone de la cliquez sur le code de gestion que chrome pense qu'il n'est pas déclenché par un clic, même si elle est causalement liée à un clic. Est-il un moyen pour éviter cela sans faire la requête ajax synchrone?
MODIFIER
Voici quelques un minimum de code qui illustre ce comportement:
$('#myButton').click(function() {
$.ajax({
type: 'POST',
url: '/echo/json/',
data: {'json': JSON.stringify({
url:'http://google.com'})},
success: function(data) {
window.open(data.url,'_blank');
}
});
});
Une note de clarification: je suis plus conerned sujet de l'ouverture dans une fenêtre séparée plutôt qu'un onglet, que je suis sur qu'il soit bloqué par un bloqueur de pop-up.
source d'informationauteur Thayne
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter
Modifier
Bien, je ne pense pas que vous pouvez obtenir autour de popup-bloquants lors de l'ouverture d'une page qui n'est pas le résultat immédiat d'une action de l'utilisateur (c'est à dire pas async).
Vous pouvez essayer quelque chose comme cela, il devrait ressembler à une action de l'utilisateur à un pop-up blocker:
Edit 2
Dirait que vous êtes mieux de garder les choses de synchronisation.
Tant que la fenêtre est "de la même origine" vous avez le pouvoir de le manipuler avec JS.
Essayez d'ajouter async: false. Il convient de travail
La réponse posté par @pstenstrm ci-dessus (Edit 2), l'ensemble fonctionne, mais j'ai ajouté juste une ligne de prendre la solution la plus élégante. L'appel ajax dans mon cas était de prendre plus d'une seconde et l'utilisateur face à une page blanche a posé un problème. La bonne chose est qu'il existe un moyen de mettre du contenu HTML dans la nouvelle fenêtre que nous venons de créer.
e.g:
Cela remplit le nouvel onglet avec le texte "Veuillez patienter pendant que vous êtes redirigés...", ce qui semble plus élégante que l'utilisateur regarde une page blanche pour une seconde. Je voulais poster ce que le commentaire, mais n'ont pas assez de réputation.
Ce qui a fonctionné pour moi a été:
Vous ouvrez une nouvelle fenêtre de l'onglet avant la synchronisation appel alors que vous êtes toujours dans la portée, saisir la poignée de la fenêtre, puis re-naviguer une fois que vous recevez l'ajax résultats dans la promesse.
Il n'y a aucun moyen fiable. Si votre onglet/fenêtre a été bloqué par un pop-bloqueur dans FF et IE6 SP2 puis fenêtre.ouvrir renvoie la valeur null.
https://developer.mozilla.org/en-US/docs/Web/API/Window/open#FAQ