2015-02-10 163 views
1

我試圖將幾個點擊動作關聯到jQuery中的幾個按鈕。我正在使用for循環來瀏覽所有按鈕。關聯按鈕並單擊循環中的動作

我想類似的東西:

var realThis = $(this); 

// ... 

for (var i = 0; i < buttons.length; i++) { 
    if (typeof(buttons[i].callback) !== 'undefined') 
     $('#' + buttons[i].id).click(function(){ 
      buttons[i].callback(realThis.getFormValues()); 
     }); 
} 

我從我的編輯軟件警告:

可變變量是從封閉訪問

我試過幾件事情沒有任何成功。

這裏有什麼幫助嗎?

+0

這裏您的代碼似乎有點過-C omplicated。如果所有按鈕都具有相同的事件處理程序,則不需要在循環中分配它。您可以使用一個類來一次選擇所有元素。 – 2015-02-10 10:09:47

+0

你有沒有嘗試設置'var formValues = realThis.getFormValues();'在循環和內部使用'按鈕[i] .callback(formValues); '? – dfsq 2015-02-10 10:11:21

+0

@RoryMcCrossan謝謝你的回答。所有的回調函數都可能不同於一個按鈕:/我無法避免使用循環。 – 2015-02-10 10:15:38

回答

0

終於找到了回答我的問題:

for(var i = 0; i < buttons.length; i++) 
{ 
    (function() 
    { 
     if(buttons[i].callback) 
     { 
      var callbackTemp = buttons[i].callback; 

      $('#' + buttons[i].id).click(function(){ callbackTemp(realThis.getFormValues()); }); 
     } 
    })(); 
} 

感謝您幫助;)

1

我會改變你的HTML結構,以便你知道哪個處理程序將被連接。數據屬性可以幫助你:

<button id="button-1" data-button-id="1" class="button-action"> 
    Do action 1 
</button> 

<button id="button-2" data-button-id="2" class="button-action"> 
    Do action 2 
</button> 

然後,您可以附上您的處理程序所有的按鈕,並找出你想在點擊呼叫,而不是提前哪些功能:

$('.button-action').on('click', function (e) { 
    // get the button index from the data attribute 
    var buttonId = $(e.currentTarget).data('buttonId'); 
    // if there's a callback then execute it 
    if (buttons[buttonId].callback) { 
    buttons[buttonId].callback(realThis.getFormValues()); 
    } 
});