2010-11-23 144 views
0

當複選框被選中時,我將一個元素添加到數組中,並且當它未被選中時我需要將其刪除。我使用拼接來刪除元素。當它沒有被選中時,我似乎無法調用事件。我嘗試使用這樣的:當複選框未選中時從數組中刪除元素

if ($('input[name="'+category+'"]:checked')) 
    item_id[category] = $(this).attr("id"); 
else 
    item_id.splice(category, 1); 

它增加了所需要的元素行,當複選框被選中,但它似乎並不時,它的選中將其刪除。變量類是一個循環變量,並且是正確的。

如果有人能解決這個問題,將不勝感激。

+0

「item_id」肯定是一個數組,而`category`絕對是一個整數嗎? – 2010-11-23 10:02:00

回答

1

不能完全確定你所追求的是誠實的,但這裏是我的解決了這個,希望它爲你的作品以某種方式

JavaScript數組 - 的indexOf方法: http://www.tutorialspoint.com/javascript/array_indexof.htm

<script> 

if (!Array.prototype.indexOf) 
{ 
    Array.prototype.indexOf = function(elt /*, from*/) 
    { 
    var len = this.length; 

    var from = Number(arguments[1]) || 0; 
    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 
    if (from < 0) 
     from += len; 

    for (; from < len; from++) 
    { 
     if (from in this && 
      this[from] === elt) 
     return from; 
    } 
    return -1; 
    }; 
} 

$(function() { 

    var checkedItems = new Array(); 

    $(":checkbox").change(function() { 
     if($(this).attr('checked')) 
     { 
     checkedItems.push($(this).attr("id")); 
     } 
     else 
     { 
     var index = checkedItems.indexOf($(this).attr("id")); 
     checkedItems.splice(index,1); 
     } 
    }); 

}); 
</script> 

HTML

<input type="checkbox" id="c1" value="1"> 
<input type="checkbox" id="c2" value="2"> 
<input type="checkbox" id="c3" value="3"> 
1

splice函數是爲了返回已刪除的內容,因此請通過顯示其返回值來啓動調試。

2

無論元素是否匹配,jQuery選擇器總是返回一個對象。

你有效地得到了什麼是:

if (new Object()) 
    item_id[category] = $(this).attr("id"); 
else 
    item_id.splice(category, 1); 

對象總是truthy(不管它是一個空的對象或對象約翰Resig的初始化),所以這if聲明絕不會執行else

你大概什麼後:

if ($('input[name="'+category+'"]:checked').length) 
    item_id[category] = $(this).attr("id"); 
else 
    item_id.splice(category, 1); 

哪些檢查length屬性。

但是這仍然不起作用,因爲splice()會移動數組中的所有元素;使得category錯誤。

如果您將事件綁定到多個複選框元素上,則使用.bind()(及其對應的.click())將是不明智的,因爲此方法將爲每個複選框綁定一個事件。相反,請使用.live().delegate();這會將一個事件綁定到所有複選框元素的祖先,並偵聽事件(使用JavaScripts事件冒泡),效率更高。

考慮到這兩點,你可能會喜歡這樣的東西。如果條件是返回jQuery的元素列表選擇

$('input[name="'+category+'"]').is(':checked') 

正如馬特提到,當前的:

$(yourJquerySelector).live('change', function() { 
    var category = '?' // (this.value ?) 

    item_id[category] = this.checked ? this.id : undefined; 
}); 
+0

非常感謝您的意見。現在我有效的是這樣的:我檢查複選框的長度,它會將元素添加到數組中,但它不會調用其他的(我檢查了一個警報)。當它被檢查時,它的長度是1,但是當它不是時,它不會返回任何東西,因此,否則不執行。這與.is()方法一樣。我使用.live()和'change'事件。 – donkapone 2010-11-23 10:47:50

+0

@ donkapone:你是什麼意思「它不會返回任何東西」?如果沒有元素匹配,長度將爲0.這種事情出現在jQuery代碼中數百次。你能否更新你的問題以確切地包括你現在擁有的東西? (也許有點額外;例如`item_id`和`category`的整個事件綁定和變量聲明)。 – Matt 2010-11-23 10:57:02

1

更改,如果條件。測試返回的元素的數量(使用length屬性)也可以做到這一點。

相關問題