2010-12-19 81 views
0

我有一個異步函數,它由一個「onmouseover」觸發,它將一個對子節點的請求發送到列表並顯示它們。將它設置爲同步可以防止這種情況,但據我所知,它需要是異步的才能在Chrome和IE中顯示加載圖標。問題在於,如果在函數仍在執行時您多次使用鼠標滑過,則會多次加載子項。我遇到的麻煩是阻止該功能一次運行多次,以防止多次加載子節點。jQuery - 保持一個異步函數不止一次同時運行

在此先感謝!

我的Ajax調用(jQuery的,而不是$,因爲我在noconflict模式下運行):

var ul = "#ul_" + categoryId; 
    var ifUlExists = jQuery(ul); 

    // Only if UL not already loaded 
    if (ifUlExists.length == 0) { 

     jQuery.ajax({ 
    type: 'POST', 
    url: '/adminajax/add_kids', 
    data: { 
     categoryId: categoryId 
    }, 
    beforeSend:function(){ 
     // Toggle +/- icon 
     jQuery(expandIcon).addClass("loading"); 
    }, 
    success:function(resp){ 
     var kids = resp;   
     // If there are kids returned by the query 
     if (kids){ 
     var container = "#c_"+categoryId;  
     jQuery(kids).insertAfter(jQuery(container)); 
     jQuery(ul).slideDown("slow"); 
     } 
    })}; 
    } else { 
    jQuery(expandIcon).addClass("collapse"); 
    jQuery(ul).slideDown("slow"); 
    } 

回答

1

它不會跑 「同時」;一個更好的詞將是「同時」。反正只是設置一個標誌:

if (ifUlExists.length === 0 && !$('body').data('loadingUl')) { 
    $('body').data('loadingUl', true); 
    // the rest of your code 
} 

使用「body」元素的數據僅僅是數不勝數的方式來做到這一點,但我種-的喜歡它,因爲$('body')由jQuery的製作相當便宜。當然,你可以隨時隨地保持國旗。

+0

謝謝你太多了!絕對是我一直花費數小時試圖弄清楚的。 – Matt 2010-12-19 18:51:48

1

的標誌是一個選項:

var running = false; 

$(selector).mouseover(function() { 
    if(!running) { 
     running = true; 
     callAsyncFunction(); 
    } 
}); 

,並在Ajax請求的回調,再次設置running = false

如果您想爲多個元素執行此操作,可以使用該元素的data()函數作爲@Pointy describes in his answer