2012-05-04 85 views
0

私はこれを投稿する前にトンを読み、それを動作させるために何ができるか試しました。だから、基本的に私はajaxStop()を他のjQueryのAjaxリクエストがロードされた後に処理するためのフックとして使用しようとしているので、それを操作して追加することができます。jQuery ajaxStop()は増分して複数回発生します

しかし、私は私の追加の要求に追加複数回実行すると思われる)ajaxStopを(使用しないときにはそう...

今試行錯誤の少し後。私はこれが私のajaxStop()関数の中で何かがクリックされた後、ポップアップにデータをつかむために別のAjaxポストを呼び出すからです。このクリックイベントハンドラは、他のすべてのajaxがロードされた後に登録される必要があります。なぜなら、ajaxStop()メソッドから取り除くと多重度エラーはなくなりますが、 tレジスタを削除します。私はこの間違いの可能性が最も高いですが、いくつかの助けを使うことができます。遅くなって脳が痛いので、明日それを見てみましょう。

jQuery('.content').one('ajaxStop', function() { 

setInterval(doPopUpOptionsMenu , 1000); 
return false; 

}); 

doPopUpOptionsMenuの中には、オプションのポップアップのコンテンツを取得する別のajax呼び出しがあります。

function doPopUpOptionsMenu() { 
jQuery(".activity-popUpMenu").one('click',function(e) { 
var activityId = jQuery(this).parent().attr('id').split('-'); 
//code to grab options and show the user the Options box. 

    jQuery("#optionsPopUpContainer").css({'display': 'block', 'position' :'absolute', 'top' : e.pageY , 'left' : e.pageX}); 
var myAjaxURL = "example.com"; 
    var jqxhr = jQuery.post(myAjaxURL, { menuOptions : true, id : activityId[1] } ,  function($response) { 
jQuery("#optionsPopUpContainer").html($response); 
}) 
.success(function() { alert("second success"); }) 
.error(function() { alert("error"); }) 
.complete(function() { alert("complete"); }); 

}); 
jQuery(".activity_update").hover(
function(){ 
jQuery(this).children('.activity-popUpMenu').addClass('activated'); 

} , 
function() { 
jQuery(this).children('.activity-popUpMenu').removeClass('activated'); 
//jQuery(".activity-popUpMenu").unbind('click'); 
    }); 

} 

今、このための警告は、それが成功するために、一度完全に一度べきとして最初のクリックで二回ポップアップ表示されます。ポップアップオプションをもう一度クリックすると、4つのアラートが16よりも8つ表示され、ポップアップが倍増し続けます。私が言ったように、これはajaxStopコール内のajaxに起因すると考えられましたが、どうやってもっとうまくいくのでしょうか?

答えて

0

ドキュメント内ですべてのAjax呼び出しが完了した後に何か作業したい場合は、$(document).ajaxComplete(function(){handler});を使用します。おそらく最善のアプローチではありませんが、すべてのAjaxが終了するのを待っていればうまくいきます。

+0

しかし、文書が変更されてもうまくいけば、ページを読み込んでコンテンツを変更した後、このポップアップオプションajaxを再度呼び出すよりも、ajaxをもう一度呼び出すと言うことができます。これは一度しか動作しませんか? – Pengume

+0

私はそれがajaxStopの目的だと思っていました。 ajaxCompleteは、1つのajax呼び出しが完了したときです。私が上で言ったことは間違っていた。ドキュメントをセレクタとして使用しても何も変更されませんでした。 – Pengume

+0

私はそれを何かを付けるよりもグローバルリスナーとして使用しました。だからあなたはあなたの文書の中で$ .ajax(___)を行うことができます。準備が整った$(document).ajaxComplete()は一旦$ .ajax()を起動します。だから、ドキュメントの中に10個のajaxコールがあるとしましょう。一度すべてが$(document).ajaxCompleteを終了すると、この10回の呼び出しが終了すると起動します。あなたが達成しようとしていることではありませんか? – Vic

0

キューでAJAXリクエストを追跡する場合は、$ .ajaxStopが発生する前に行われた実際のリクエストを調べることができます。キャッチは、AJAX呼び出しにdoNotQueueプロパティを設定して、選択した呼び出しをキューから除外できるようにする必要があることです。

$ .ajaxSendでjqXHRオブジェクトを使用すると、これはあまり難しくありません。ここでは行くを取得する必要がありますいくつかのサンプルのCoffeeScriptのコードは次のとおりです。

$.xhrPool = [] 
# When sent, all ajax requests get pushed into the XHR pool so we can abort/access 
# them if necessary. 
$(document).ajaxSend((event, xhr, ajaxOptions) -> 
    unless ajaxOptions.doNotQueue 
    $.xhrPool.push(xhr) 
) 

# Whenever an ajax call completes, remove it from the queue and then perform the 
# desired operation if the queue is empty. 
$(document).ajaxComplete((event, xhr, ajaxOptions) -> 
    index = $.xhrPool.indexOf(xhr) 

    # If this is a request being tracked by the queue, remove it from the queue 
    if index > -1 
    $.xhrPool.splice(index, 1) 

    # If the queue is now empty then all ongoing AJAX calls we want to track 
    # have finished. 
    if $.xhrPool.length == 0 
     # Perform your desired action here, but make sure that if you make an AJAX 
     # call you include the doNotQueue property. Note that this will fire every 
     # time your queue runs out, so if you want to do something only once globally, 
     # you'll have to keep track of that yourself. 
) 
1

私は同様の問題を持っていたので、私は答えを探してこの記事に出くわし。私の状況では、​​を使用して、さまざまなファイルをページにロードしています。 Vicの例である$(document).ajaxComplete(function(){ //my function });を使用すると、My関数は実際に5回実行されます。私は5つの.load()リクエストを持っています。したがって、私は、.ajaxComplete()が各リクエストの後にこの機能を実行するように見えます。私の解決策については

私は...

$(document).ajaxStop(function() { 
    //my function 

}); 

を使用し、それは私が望んでいる、かつての機能を実行しました。

0

asyncのプロパティがfalseに設定されていないことを確認してください。

...私はずっと見落としていたものです。

関連する問題