2016-11-17 138 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