web-dev-qa-db-ja.com

JavaScript window.openが機能しない

OK。 Twitterにログインしようとしています。このコードではウィンドウが開いていません。警告される応答はnullではなく、ログイン画面へのリンクです。何か案は?

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

最近のほとんどのブラウザーに含まれている標準のポップアップブロッカーロジックは、ユーザーアクションの直接の結果ではないwindow.open()への呼び出しをすべてブロックします。タイマーまたは非同期コールバック(ajax対応関数など)によってトリガーされるコードは、ユーザーアクションによって直接引き起こされたものではなく、通常、新しいポップアップウィンドウがブロックされます。

ブラウザーのポップアップブロックを一時的に変更して(オフにして)、これが起こっていることを確認し、それが機能することを確認できます。

おそらく、回避策として行う必要があるのは、このコードのスレッドを開始したユーザーアクションでウィンドウを作成し、ajax応答を受け取ったときにコンテンツをウィンドウに配置することです。ブラウザはおそらくそれを可能にするでしょう。私はそれが視覚的な観点からはあまり望ましくないことを知っていますが、ajax応答が来るまで( "loading ..."のようなもの)一時的なコンテンツをウィンドウに置くことができます。

48
jfriend00

ちょうどこれとまったく同じ問題がありました。あなたがそれを修正したコードが欲しかった場合に備えて。私はこれを使いました:

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