16

その例を示すだけで、問題を説明しやすくなります-> http://jsfiddle.net/RU2SM/
ご覧のとおり、「AJAX」と「Direct」の2つのボタンがあります。 ...したがって、[直接]をクリックするとウィンドウ(Chromeの新しいタブ)が開きますが、AJAX成功ハンドラーでwindow.open()を作成しようとすると、同じように機能しません。
問題はAJAXにあると確信していますが、修正方法がわかりません。
良いアイデアをいただければ幸いです。ありがとう

4

4 に答える 4

33

これは魅力のように機能します:

// 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')
    }
})

これが行うことは、Ajax呼び出しが成功した場合、変数successをtrueに設定することです。プロパティは、Ajax呼び出しが完了した後にifステートメントが実行されることを確認します
。 したがって、window.openは、直接リンクと同じ状況で起動されます。async:false

于 2012-04-19T07:30:12.160 に答える
15

window.open問題は、ユーザーの操作に直接応答して呼び出されない限り、ブラウザーがsをブロックすることがよくあることです。そのため、クリックハンドラーは機能しますが(クリックはユーザーアクションです)、AJAXハンドラーは機能しません。

1つの解決策は、最初のクリックアクション中にウィンドウを開き、AJAXが成功したときにその場所を更新する(またはAJAXが失敗したときに再び閉じる)ことです。

それ以外の場合は、ユーザーがブラウザでドメインからのポップアップを明示的に許可するようにする必要があります。

于 2012-04-19T07:29:25.313 に答える
1

さらに、async: false を使用してから window.open を呼び出すと、chrome と firefox で機能しますが、safari では問題が発生する可能性があることにも言及する価値があります...ポップアップがブロックされたという情報さえ提供しません

于 2012-04-19T07:46:01.733 に答える
1

ajax 呼び出しが成功した後に任意のロジックを実装するより良い方法は、すべての ajax 呼び出しの実行、つまり$.ajax.Request.doneおよび$.ajax.Request.failで発生するイベントがあります。 $.ajax.Request.done(function(){ if(success){ // ロジックを実装 } });

于 2012-04-19T09:52:57.923 に答える