2012-11-09 52 views
2

可能重複(關閉):
Javascript closure inside loops - simple practical example的jQuery/JavaScript的分配環路點擊事件

我創建狀態的表的 「儀表板」 網頁。每個狀態都處於「開」或「關」狀態。

我想使用jQuery button/buttonset有切換/切換控制,以允許用戶切換狀態的值。我作爲ajax數據庫查詢的結果動態創建表和按鈕。

我基本上試圖在用戶點擊其中一個按鈕時觸發一個ajax查詢,但我努力正確地指定click事件。

無論點擊哪個按鈕,我的第一個回合都有最終列表值。

因此,阿哈!這是一個標準的「JavaScript關閉」問題。 (所以我認爲...)

進一步玩弄它沒有得到任何東西,我真的不明白關閉問題,足以找出爲什麼我的技術是錯誤的。

這是我想調用的代碼:

function SetStatus(item, status) { 
    var params = '{itemName: "' + item + '", status: "' + status + '"}'; 
    $.ajax({ 
     type: "POST", 
     url: "WebServices/Dashboard.asmx/SetItemStatus", 
     data: params, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: StatusSet, 
     error: ShowError 
    }); 
} 

下面是當前代碼版本我想:

$(itemOnButton).click(
    function (_item) { 
     SetStatus(_item, 'On'); 
    } (itemName) 
); 

的結果是,一旦從數據庫中獲取的結果(然後才顯示)SetStatusstatus =='開'的最後一個項目觸發。

我知道這很簡單,我仍然相信這是一個基本的關閉問題,但我把頭撞在牆上!謝謝你的幫助!

回答

5
$(itemOnButton).click(
    function (_item) { 
     SetStatus(_item, 'On'); 
    } (itemName) 
); 

當你點擊時正在激發你的'關閉'功能。嘗試

$(itemOnButton).click(
    function (ev) { 
     // this is the clicked element 
     // ev is the event object 

     // how do you get the name? 
     // var itemName = $(this).attr("name"); 

     SetStatus(itemName, 'On'); 
    } 
); 

你也可以做

$(itemOnButton).click(
    function (_item) { 
     return function (ev) { 
      SetStatus(_item, 'On'); 
     }; 
    } (itemName) 
); 

現在它觸發像你這樣,但它不會立即執行,而是返回了事件處理函數點擊。

返回的事件處理函數現在是_item的閉包。匿名函數是_item的作用域,通過參數設置爲itemName。

+0

你的第一個例子擺脫了自動點擊,但仍然只有最後一項傳入,無論按鈕。第二個例子是什麼使頁面工作。謝謝! – mbm29414

+0

不客氣。在stackoverflow上閱讀[這非常好的答案](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)。 – metadings