0

私はこれを投稿する前に1トン読んで、それを機能させるためにできることを試しました。つまり、基本的には、他のすべてのjQuery ajaxリクエストが読み込まれた後、ajaxStop()を一種のフックとして使用して、操作して追加できるようにしようとしています。

しかし、ajaxStop()を使用すると、追加の追加リクエストが複数回実行されるようです...

少し試行錯誤した後です。これは、ajaxStop()関数内で、何かがクリックされたらデータを取得してポップアップを表示するために、別のajax投稿を呼び出しているためです。他のすべてのajaxがロードされた後、このクリックイベントハンドラーを登録する必要があります... ajaxStop()メソッドから削除すると、多重度エラーはなくなりますが、ajaxを介してコンテンツを更新すると、クリックイベントは発生しません。 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');
  });

 }

これで、このアラートが最初のクリックで2回ポップアップします。これは、成功の場合は1回、完了の場合は1回です。ポップアップオプションをもう一度クリックすると、16よりも8つではなく4つのアラートがポップアップし、ポップアップが2倍になります。私が言ったように、これはajaxStop呼び出し内のajaxが原因であると想像しましたが、どうすればそれを回避したり、より良いことをしたりできますか...?

4

5 に答える 5

1

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

私の解決策のために私は使用しました...

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

});

そして、それは関数を一度実行しました、それは私が欲しかったものです。

于 2012-08-16T18:19:37.970 に答える
0

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

于 2012-05-04T08:25:22.317 に答える
0

キュー内のAJAXリクエストを追跡すると、$。ajaxStopが起動する前に行われた実際のリクエストを検査できます。問題は、選択した呼び出しをキューによる追跡から除外できるように、AJAX呼び出しにdoNotQueueプロパティを設定するなどの操作を行う必要があることです。

$ .ajaxSendでjqXHRオブジェクトを使用する場合、これは実際にはそれほど難しくありません。これがあなたを動かすはずのいくつかのサンプルコーヒースクリプトコードです:

$.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.
)
于 2012-06-06T18:03:33.333 に答える
0

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

...ずっと見落としていたもの。

于 2014-11-12T10:38:33.860 に答える
0

同様の問題がありました。私のすべてのajaxリクエストはajaxStopのコードを実行しました。私は物事を構築するためにページのロード時にいくつかのajaxリクエストを持っていました、そしてそれらはajaxStop呼び出しを使用する唯一のものでなければなりません。私が見つけた解決策は、ajaxStop関数のバインドを解除して、1回だけ実行されるようにすることでした。

$(document).ajaxStop(function() {
    customFunction();       
    $(document).unbind("ajaxStop");
});
于 2020-01-15T17:44:51.777 に答える