2011-12-16 38 views
2

我有以下的原型代碼在單擊按鈕時觸發過程:爲什麼jQuery.attr()方法在我的'click'事件中不起作用?

jQuery("#queue-process").click(function() { 
    jQuery("#queue-process").attr("disabled", "disabled"); 
    try { 
     processQueue(); 
    } catch (e) { 
     console.log(e.message); 
    } finally { 
     jQuery("#queue-process").removeAttr("disabled"); 
    } 
}); 

processQueue功能總是叫,但只有當我在Chrome的JavaScript控制檯調試匿名函數的attr("disabled", "disabled")被調用時,也就是說,如果我在該行上放置一個斷點,並單步執行該操作,它將起作用,但在調試器外部僅執行processQueue()

爲什麼會發生這種情況?

+2

你確定'processQueue()`不是很快,只有一秒鐘禁用按鈕?使用調試器的唯一區別是執行速度。 – Interrobang 2011-12-16 09:17:36

回答

5

當你不調試的時候它可能正在執行。

我的猜測是processQueue()立即返回,因此代碼馬上轉到finally塊,並且組件立即被重新啓用,所以您實際上並沒有看到它。如果您調試,則會阻止執行,並且您可以看到該組件被禁用。

processQueue究竟做了什麼?如果它正在做一些Ajax工作,請記住,默認情況下,Ajax請求是異步執行的。也許你需要傳遞一個回調函數到processQueue,所以你只能在完成工作時重新啓用#queue-process?