2016-11-17 209 views
2

我正在處理包含複選框和值的下拉列表。當我選擇一個複選框時,該特定項目的ID將被附加到右側面板上的輸入中,並且該項目的值將以右側面板上的標籤形式附加。當我再次點擊一個選中的複選框時,附加值和右邊的標籤必須被刪除。從數組中刪除值

我面臨的問題是,我取消選中的複選框沒有被刪除,而是其他一些附加值附加值被刪除。

的Javascript:

var arr = []; 
$(".taglistarea input[type='text']").click(function(){ 
    if(!$(this).parent("div").next(".taglist").is(":visible")) { 
     $(this).parent("div").next(".taglist").slideDown(); 
    } else { 
     $(this).parent("div").next(".taglist").slideUp(); 
    } 
}); 

$(".taglist ul li a input[type='checkbox']").click(function(){ 
    var tagidall = $(".taglist ul li a").attr("id"); 

    var tagideach = $(this).parent("a").attr("id"); 
    var tagtexteach = $(this).text(); 

    arr.push(tagideach); 

    if($(this).is(":checked")) { 
     $(this).addClass("active"); 
     $(".ss").append('<a href="#" id="'+tagideach+'" class="tagss">International<span class="closetag"></span></a>');  
    } else { 
     $(".ss a[id="+tagideach+"]").remove(); 
     //arr.splice(tagideach,1); 
    } 
    //alert(arr); 
    $("#idvals").val(arr.toString()); 
}); 

我認爲這個問題是在這裏:

arr.splice(tagideach,1); 

完整的小提琴是在這裏: https://jsfiddle.net/kue83ud8/

感謝。

回答

3

如你所說,問題是arr.splice(tagideach,1);

splice第一個參數是指數刪除,而不是一個對象

就應該更換該行以arr.splice(arr.indexOf(tagideach),1);(您也應該檢查如果indexOf返回的值不是-1

另一個備註

你應該緩存你的選擇,以提高性能:

if(!$(this).parent("div").next(".taglist").is(":visible")) { 
    $(this).parent("div").next(".taglist").slideDown(); 
} else { 
    $(this).parent("div").next(".taglist").slideUp(); 
} 

應該變成:

var element = $(this).parent("div").next(".taglist"); 
if(!element.is(":visible")) { 
    element.slideDown(); 
} else { 
    element.slideUp(); 
} 

,而不是檢查,如果元素是可見的,你可以使用slideToggle()

此外,你應該閱讀關於事件代表團 in jQuery

+0

感謝您的代碼,@pwolaq。你的改變奏效了,我也搬了arr.push(tagideach);在內部如果($(this).is(「:checked」)){爲了確保切片僅在複選框被選中時發生。但是,你能解釋一下.splice函數,以及如何用','分隔的2個值被添加到splce中嗎?請也解釋爲什麼我應該檢查是否值保留不是-1。 – user3450590

+0

如果在數組中找不到元素,那麼'indexOf'返回-1 - 如果是的話,那麼你不應該使用'splice'; 'splice'的第一個參數是開始索引,第二個是要刪除的元素的數量 - 你應該在文檔 – pwolaq

1

組元素索引從數組中刪除

arr.splice(arr.indexOf(tagideach),1); 
+1

中看到這與我的答案有什麼不同? – pwolaq