2014-01-08 25 views
0

所以我有一個表格顯示每行有2個複選框的表格。提交表單時,我試圖對至少有一個複選框選中到後端的行進行ajax操作。在javascript數組中檢測重複的jquery元素

標記:

<form id="my_form"> 
    <table> 
    <tr data-id="1"> 
     <td><input type="checkbox" class="js-option-1"></td> 
     <td><input type="checkbox" class="js-option-2"></td> 
    </tr> 
    <!-- etc --> 
    </table> 
</form> 

所以,我有一個事件處理程序,試圖建立對象的數組發送到後端:

$("#my_form").live 'submit', (event) -> 
    event.preventDefault() 
    rows = [] 
    $("input:checked").each() -> 
    rows.push row 
    objects = [] 
    $.each objects, (index, value) -> 
    object = { 
     id: $(@).attr("data-id") 
     option_1: $(@).find("js-option-1").val() 
     option_2: $(@).find("js-option-2").val() 
    } 
    objects.push object 
    # ajax code 

的問題,當然,如果兩個選項被選中,我最終得到了數組中的兩個對象,從而發送了數據。

我試圖通過嘗試檢測重複來解決這個問題兩個陣列上,而忽略推在這種情況下:,

$("input:checked").each() -> 
    row = $(@).closest("tr") 
    if $.inArray(row, rows) == -1 #if no duplicate 
    rows.push row 

# or 

if $.inArray(object, objects) == -1 
    objects.push object 

這兩種方法失敗了,但是因爲我承擔機制比較對象文字和jquery對象導致它們被認爲不相等,即使它們在所有通常方面都是相同的。任何其他想法?

+1

你明白'live'已棄用多年,並*刪除*在V1.9 ... –

+0

比較原始的DOM節點 – adeneo

+1

如果兩個複選框都會被檢查,您發送的是冗餘數據......爲什麼不使用單選按鈕,那麼您根本不需要檢查? – ToastyMallows

回答

1

使用選擇

$(':checked').closest('tr') 

使您的選擇邏輯不包括在首位重複。 或者如果你喜歡邏輯的其他方式,這是比較明顯的:

$('tr').has(':checked') 
+1

這可能是答案。可以使用**很多**更好的解釋。或者甚至任何。 –

+0

增加了一些,但不能拿出更好的解釋。 – peterfoldi

0

不要迭代的input:checked集合,但在tr:has(:checked),這樣你就只處理具有至少每行一個選項檢查一次。

嘗試:http://jsfiddle.net/NrHQ4/(對不起,沒有咖啡)

$('#my_form').on('submit', function(e){ 
    var $this = $(this), rows = $this.find('tr:has(:checked)'), objects = []; 
    rows.each(function(){ 
     var $row = $(this); 
     objects.push({ 
      id : $row.data('id'), 
      option_1 : $row.find('.js-option-1').is(':checked'), 
      option_2 : $row.find('.js-option-2').is(':checked') 
     }); 
    }); 
    console.log(objects); 
    e.preventDefault(); 
});