2012-04-19 7 views
15

可能性の重複AJAXの成功に異なる動作します:
window.open(url) different behavior - same code, different timingwindow.open()は

私はちょうどあなたにその例を示しているなら、私は問題を説明することがより簡単になります - あなたは2つのボタン、1 called'AJAX」と呼ばれる1 『DIRECTがある見ることができるように直接』あなたはをクリックすると...だから 『>http://jsfiddle.net/RU2SM/
は、』それは、ウィンドウ(クロームに新しいタブ)を開きますが、私が作るしようとした場合window.open()AJAXの成功ハンドラで、それは動作しません同じ方法。
問題はAJAXからのものだと確信していますが、修正方法はわかりません。
いいアイディアがありがとう。 ありがとう

+0

[window.open(url)違う動作 - 同じコード、違うタイミング](http://stackoverflow.com/questions/9793774/window-openurl-different-behavior-same-code-different-タイミング)とExt.Ajax.request()内で呼び出されたときの[extjs 4.0の一貫性のないwindow.open()の動作](http://stackoverflow.com/questions/10049172/extjs-4-0-inconsistent-window-open-behavior -when-called-ext-within-a-ajax-reques) –

答えて

26

これは魔法のように動作:これは何

// 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呼び出しが成功である場合、それは本当の変数の成功を設定しています。
async:false proppertyは、Ajax呼び出しの完了後にifステートメントが起動されるようにします。
したがって、直接リンクと同じ状況でwindow.openが発生します。

+1

非同期リクエストでは落とし穴がいくつかありますが、リクエストしているページに遅延がある場合は使用しないでください。 [jQueryのドキュメント](http://api.jquery.com/jQuery.ajax/)から: "同期リクエストはブラウザーを一時的にロックし、リクエストがアクティブな間にアクションを無効にすることに注意してください。" – Gareth

+0

これは本当ですが、このソリューションを使用する際には注意する必要がありますが、これは同じ状況で両方の機能を実行する唯一の方法です(私が知る限り)Ajaxバージョンでポップアップを許可してもそれはポップアップを作成し、直接呼び出しのような別のタブを開きません。なぜ動作に違いがあるのか​​正確にはわかりませんが、これはやり取りをするようです。 –

+0

ありがとうございます。魅力 ":) ブラウザのフリーズを防ぐために、タイムアウト= 2000を追加しました... – T1000

12

ユーザーアクションに直接応答しない限り、ブラウザーでブロックされることが多いという点は、window.openです。そのため、クリックハンドラが動作します(クリックはユーザアクションですが、AJAXハンドラは動作しません)。

一つの解決策は、AJAX成功した場合にその位置を更新(またはAJAXの故障で再びそれを閉じ)、その後、最初のクリックアクション時にウィンドウを開くことです。

そうしないと、ブラウザのドメインからのポップアップを明示的に許可する必要があります。

+1

はい、これも解決策ですが、レスポンスに特定の情報がある場合にのみウィンドウを開く必要があります...これは私にとっては良い解決策ではありません。 – T1000

0

さらにasync:falseを使用してwindow.openを呼び出すと、chromeとfirefoxで動作しますが、Safariで問題を引き起こす可能性があることにも言及する価値があります...ポップアップがブロックされたという情報も与えません

1

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