その例を示すだけで、問題を説明しやすくなります-> http://jsfiddle.net/RU2SM/
ご覧のとおり、「AJAX」と「Direct」の2つのボタンがあります。 ...したがって、[直接]をクリックするとウィンドウ(Chromeの新しいタブ)が開きますが、AJAX成功ハンドラーでwindow.open()を作成しようとすると、同じように機能しません。
問題はAJAXにあると確信していますが、修正方法がわかりません。
良いアイデアをいただければ幸いです。ありがとう
4 に答える
これは魅力のように機能します:
// 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
window.open
問題は、ユーザーの操作に直接応答して呼び出されない限り、ブラウザーがsをブロックすることがよくあることです。そのため、クリックハンドラーは機能しますが(クリックはユーザーアクションです)、AJAXハンドラーは機能しません。
1つの解決策は、最初のクリックアクション中にウィンドウを開き、AJAXが成功したときにその場所を更新する(またはAJAXが失敗したときに再び閉じる)ことです。
それ以外の場合は、ユーザーがブラウザでドメインからのポップアップを明示的に許可するようにする必要があります。
さらに、async: false を使用してから window.open を呼び出すと、chrome と firefox で機能しますが、safari では問題が発生する可能性があることにも言及する価値があります...ポップアップがブロックされたという情報さえ提供しません
ajax 呼び出しが成功した後に任意のロジックを実装するより良い方法は、すべての ajax 呼び出しの実行、つまり$.ajax.Request.doneおよび$.ajax.Request.failで発生するイベントがあります。 $.ajax.Request.done(function(){ if(success){ // ロジックを実装 } });