2011-11-09 39 views
1

我想弄清楚如何使用閉包函數。 在點擊事件中,我想要確定parm1parm2的值,並將它們顯示在div中, 然後使用SQL語句將新值更新到表中。javascript關閉函數的使用

如果用戶反覆點擊,我想限制(去抖動),並且只在用戶停止點擊5秒後執行SQL更新。但是,每次點擊都應該顯示parm1parm2

我不確定如何將參數傳遞給SQL過程。

(function() { 
    // create debounced function 
    var d_process = $.debounce(SQLprocess, 5000); 

    $('#myButton').click(function() { 
    // determine parameters 
    var parm1 = 1 + 1;      // edit: added var 
    $(".div_1").text(parm1); 

    var parm2 = 2+2;      // edit: added var 
    $(".div_2").text(parm2); 

    d_process(); 
    }); 
}()); 


function SQLprocess(parm1, parm2) { 
    //perform an SQL update 
} 

參考: http://code.google.com/p/jquery-debounce/

+0

你宣佈PARM1和方式parm2你可以在你的函數直接使用他們,他們是全球範圍。實現「去抖動」的另一種方式是在點擊按鈕5秒後禁用該按鈕。 – Chao

+0

超第一點。第二秒鐘,按鈕用於添加鬧鐘1分鐘,因此用戶應該可以點擊多點鐘。我只是不想更新datbase,直到他完成點擊。 –

回答

4

要使用的參數去抖動功能通過SQLprocess,改變該:

var d_process = $.debounce(SQLprocess, 5000); 

這樣:

var d_process = $.debounce(function() {SQLprocess(parm1, parm2)}, 5000); 

這產生一個匿名函數沒有傳遞到去抖動的參數。但是這個匿名函數用正確的參數調用SQLprocess。


有人要問,爲什麼你不能做到這一點:

var d_process = $.debounce(SQLprocess(parm1, parm2), 5000); 

答案是因爲,在Javavscript語言,SQLprocess(parm1, parm2)是一個函數調用。它會立即執行該函數並將返回值傳遞給$.debounce(),這不是您想要的。 $.debounce正在期待一個沒有參數的函數,所以這就是你必須通過它的。獲取參數到SQLprocess的方法是將其包裝在一個沒有參數的函數中。它不一定是一個匿名函數。它也可能是這樣用,如果你想要一個名爲功能:

function myFunctionWrapper() { 
    SQLprocess(parm1, parm2); 
} 

var d_process = $.debounce(myFunctionWrapper, 5000); 
+0

這麼簡單!爲什麼我們不首先在{SQLprocess()}中放置括號? –

+0

@MustaphaGeorge:因爲JS中的匿名函數語法是詳細的'function(){}'東西。這不是一個紅寶石:P – hugomg

+0

@MustaphaGeorge - 我添加到我的答案來解釋爲什麼你不能只添加內聯參數。 – jfriend00