jQuery ajaxStop()递增并多次触发

时间:2012-05-04 08:20:22

标签: jquery ajax post

我在发布之前已经读了很多,并尝试了我可以让它工作。所以基本上我试图使用ajaxStop()作为一种钩子来做所有其他jQuery ajax请求已经加载后,所以我可以操纵并添加更多。

但是当我使用ajaxStop()时,似乎多次执行我的额外添加请求...

现在经过一些试验和错误。我了解到这是因为在我的ajaxStop()函数中,我调用了另一个ajax帖子,一旦点击某个东西就抓取数据,填充弹出窗口。我需要在加载所有其他ajax之后注册这个click事件处理程序...因为如果我把它从ajaxStop()方法中取出,多重性错误就会消失但是如果我通过ajax刷新内容而不是click事件没有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');
  });

 }

现在,第一次点击时会弹出两次警报,因为它应该成功一次,一次完成。比我再次单击弹出选项,它会弹出四个警报,而不是八个警报,并保持两倍的弹出窗口。就像我说的我想象这是由于ajaxStop调用中的ajax,但我怎么能绕过它或做更好的事情......?

5 个答案:

答案 0 :(得分:1)

我偶然发现了这篇文章寻找答案,因为我遇到了类似的问题。对于我的情况,我使用.load()将各种文件加载到我的页面中。当我使用Vic的$(document).ajaxComplete(function(){ //my function });示例时,我的函数实际上最终运行了5次。我有5个.load()请求。所以在我看来.ajaxComplete()将在每次请求后运行该函数。

对于我的解决方案,我用过......

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

});

它运行了一次这个功能,这就是我想要的。

答案 1 :(得分:0)

如果你想在文档中所有ajax调用完成后使用某些东西,请使用$(document).ajaxComplete(function(){handler});它可能不是最好的方法,但是如果你想听所有的ajax来完成它会很好。

答案 2 :(得分: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.
)

答案 3 :(得分:0)

请确保 async 属性未设置为false

......我一直在忽视的东西。

答案 4 :(得分:0)

我有一个类似的问题。我所有的ajax请求都在ajaxStop中执行了代码。我在页面加载时有一些ajax请求来构建内容,这些应该是唯一使用ajaxStop调用的请求。 我发现的解决方案是解除ajaxStop函数的绑定,使其仅运行一次。

$(document).ajaxStop(function() {
    customFunction();       
    $(document).unbind("ajaxStop");
});