2012-05-04 74 views
0

在發佈之前,我已經閱讀了很多東西,並試圖讓我能夠使其工作。所以基本上我試圖使用ajaxStop()作爲一種鉤子來完成所有其他jQuery ajax請求已被加載後做的東西,所以我可以操縱並添加更多。jQuery ajaxStop()增加並多次觸發

但似乎當我使用ajaxStop()似乎執行我額外的請求多次添加...

現在有點試驗和錯誤之後。我瞭解到這是因爲在我的ajaxStop()函數中,我調用另一個ajax文章來獲取點擊數據後的數據,以填充彈出窗口。我需要這個點擊事件處理程序在所有其他ajax加載後註冊...因爲如果我將它從ajaxStop()方法中取出,多重性錯誤消失,但是如果通過ajax刷新內容而不是click事件,再次註冊。我很可能會出現這個錯誤,但可以使用一些幫助。現在已經很晚了,我的大腦受到了傷害,所以明天我會重新審視它。

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'); 
    }); 

} 

現在在第一次點擊時會彈出兩次警告,因爲它應該一次成功,一次完成。比我再次點擊彈出選項,它彈出四個警告比八比16,並保持倍增彈出窗口。就像我說的我想象這是由於ajaxStop調用內的ajax,但我怎麼能繞過它或做更好的事情?

回答

0

如果你想與所有的Ajax東西后工作調用該文件使用的$(document)完全.ajaxComplete(函數(){處理});這可能不是最好的方法,但如果你想聽所有的Ajax完成,它確實工作得很好。

+0

是的,但它工作,如果文檔更改可以說我調用ajax後頁面加載更改內容,並希望調用此彈出選項ajax再次。這不只是一次工作? – Pengume

+0

我認爲這是ajaxStop的用途。 ajaxComplete是當一個Ajax調用完成時。另外我上面說的是不正確的。它沒有改變任何使用文檔作爲選擇器。 – Pengume

+0

我更多地使用它作爲全局偵聽器而不是附加任何東西。所以你可以在你的文檔中準備好$ .ajax(___)$(document).ajaxComplete()將在你的文檔準備完成後觸發$ .ajax()。所以可以說,你已經準備好了10個Ajax調用。一旦他們完成$(文檔).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 });時,我的功能實際上最終運行了5次。我有5個.load()請求。所以在我看來,.ajaxComplete()將在每次請求後運行該功能。

對於我的解決方案,我用...

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

}); 

而且一次跑的功能,這正是我想要的。

0

請確定,async屬性未設置爲false

......我一直在俯視的東西。