web-dev-qa-db-fra.com

Javascript window.open ne fonctionne pas

D'accord. J'essaie de me connecter à Twitter. La fenêtre ne s'ouvre pas dans ce code. La réponse qui est alertée n'est pas nulle et est un lien vers un écran de connexion. Des idées?

var url = "./Twitter_login.php";
var con = createPHPRequest();

con.open("POST",url,true);
con.setRequestHeader("Content-type","application/x-www-form-urlencoded");
con.send("");

var response = "";

con.onreadystatechange = function() {

    if(con.readyState==4 && con.status==200) {

        response = con.responseText;    
        alert(response);
        window.open(response,"Twitter","menubar=1,resizable=1,width=350,height=500");        

    }

}
24
Quinn Finney

La logique standard de blocage des popups contenue dans la plupart des navigateurs de nos jours bloquera tous les appels à window.open() qui ne sont pas le résultat direct d'une action de l'utilisateur. Le code déclenché par des temporisateurs ou par tout rappel asynchrone (comme votre fonction ajax ready) sera traité comme NON provoqué directement par les actions de l'utilisateur et la nouvelle fenêtre contextuelle sera généralement bloquée.

Vous pouvez vérifier que c'est ce qui se passe en modifiant temporairement le blocage des popups de votre navigateur (en le désactivant) et voir qu'il commence alors à fonctionner.

Ce que vous devez probablement faire comme solution de contournement est de créer la fenêtre sur l'action de l'utilisateur qui a démarré ce fil de code, puis de placer le contenu dans la fenêtre lorsque vous obtenez votre réponse ajax. Le navigateur le permettra probablement. Je sais que c'est moins souhaitable d'un point de vue visuel, mais vous pouvez mettre du contenu temporaire dans la fenêtre jusqu'à ce que la réponse ajax arrive (quelque chose comme "chargement ...").

48
jfriend00

Je viens d'avoir exactement le même problème. Juste au cas où vous voudriez le code qui le corrige. J'ai utilisé ceci:

newWindow = window.open("", "_blank");

request = $.ajax({ ... my request which returns a url to load ... })

request.done((function(_this) {
        return function(data, textStatus, jqXHR) {
          return newWindow.location = data.Url;
        };
      })(this));
9
t_warsop