我在发布之前已经读了很多,并尝试了我可以让它工作。所以基本上我试图使用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,但我怎么能绕过它或做更好的事情......?
答案 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");
});