30

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");        

    }

}
4

2 に答える 2

62

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

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

おそらく回避策として行う必要があるのは、このコードスレッドを開始したユーザーアクションでウィンドウを作成し、ajax応答を受け取ったときにコンテンツをウィンドウに配置することです。ブラウザはおそらくそれを許可します。視覚的な観点からはあまり望ましくないことはわかっていますが、ajax応答が返されるまでウィンドウに一時的なコンテンツを配置できます(「読み込み中...」など)。

于 2012-08-06T01:36:13.277 に答える
11

これとまったく同じ問題が発生しました。それを修正するコードが必要な場合に備えて。私はこれを使用しました:

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));
于 2017-10-11T08:03:01.737 に答える