web-dev-qa-db-fra.com

window.open () fonctionne différemment sur AJAX Succès

Duplicate possible:
window.open (url) comportement différent - même code, timing différent

Il sera plus facile pour moi d’expliquer le problème si je ne vous montre que cet exemple -> http://jsfiddle.net/RU2SM/
Comme vous pouvez le voir, il y a 2 boutons, l'un appelé "AJAX" et l'autre appelé "Direct" ... Donc, si vous cliquez sur "Direct", il ouvre la fenêtre (nouvel onglet sur Chrome) mais si j'essaie de make window.open () sur AJAX gestionnaire de succès, cela ne fonctionne pas de la même manière.
Je suis sûr que le problème vient de AJAX mais je ne sais pas comment le résoudre.
Appréciera toutes les bonnes idées. Merci

15
T1000

Ça fonctionne super bien:

// Direct window.open()
$('#btnDirect').on('click',function(){
    window.open('http://google.com')
})
var success = false;  //NOTE THIS

// AJAX window.open()
$('#btnAJAX').on("click", function(){
    $.ajax({
      url: "/user/login/",
      context: document.body,
      async:false,   //NOTE THIS
      success: function(){  //THIS ALSO CHANGED
         success = true
      }
    });
    if(success){ //AND THIS CHANGED
      window.open('http://google.com')
    }
})

Cela signifie que lorsque l'appel Ajax est un succès, il définit la variable succès sur true.
La propriété async:false permet de s'assurer que l'instruction if est déclenchée une fois l'appel Ajax terminé.
Ainsi, window.open est déclenché dans les mêmes circonstances que votre lien direct.

29
Rick Hoving

Le problème est que les navigateurs bloquent souvent les window.opens à moins d'être appelés en réponse directe à une action de l'utilisateur. C'est pourquoi votre gestionnaire de clics fonctionne (un clic est une action de l'utilisateur) mais votre gestionnaire AJAX ne fonctionne pas.

Une solution consiste à ouvrir la fenêtre lors de l'action de clic initiale, puis à mettre à jour son emplacement en cas de succès de AJAX (ou à le refermer à nouveau en cas d'échec de AJAX.).

Sinon, vous devrez demander à l'utilisateur d'autoriser explicitement les popups de votre domaine dans leur navigateur.

14
Gareth

Une meilleure façon de mettre en œuvre n'importe quelle logique après le succès d'un appel ajax, un événement est déclenché à chaque exécution d'un appel ajax, à savoir $ .ajax.Request.done et $ .ajax.Request.fail . $ .ajax.Request.done (function () {if (succès) {// Implémenter la logique}});

1
zhyder

en outre, il est également intéressant de mentionner que l'utilisation de async: false, puis l'appel de window.open fonctionne en chrome et en firefox mais peut causer des problèmes en safari ... cela ne donne même pas une information indiquant qu'un popup a été bloqué.

0
Tobias Krogh