2016-11-17 34 views
2

Ich arbeite an einer Dropdown-Liste, die ein Kontrollkästchen und einen Wert enthält. Wenn ich ein Ankreuzfeld anwähle, wird die ID dieses Artikels an eine Eingabe im rechten Feld angehängt, und der Wert dieses Elements wird in Form eines Tags an das rechte Feld angehängt. Wenn ich erneut auf ein markiertes Kontrollkästchen klicke, müssen der angehängte Wert und das Tag rechts entfernt werden.Entfernen eines Wertes aus Array

Das Problem, mit dem ich konfrontiert bin, ist, dass das Kontrollkästchen Ich werde deaktiviert nicht entfernt wird, stattdessen wird ein anderer bereits eingelesener Wert entfernt.

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()); 
}); 

ich denke, dass Problem ist hier:

arr.splice(tagideach,1); 

die komplette Geige ist hier: https://jsfiddle.net/kue83ud8/

Dank.

Antwort

3

wie Sie gesagt haben, ist das Problem mit arr.splice(tagideach,1);

erste Argument von splice ist der Index zu entfernen, kein Objekt

Sie diese Zeile mit arr.splice(arr.indexOf(tagideach),1); ersetzen sollte (Sie sollten auch prüfen, wenn indexOf kehrt anderen Wert als -1

weitere Bemerkungen

sollten Sie Ihre Wähler Cache-Leistung zu verbessern:

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

werden sollte:

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

statt überprüfen, ob Element sichtbar ist, dass Sie slideToggle()

auch verwenden können, sollten Sie Lesen Sie über Ereignisdelegation in jQuery

+0

Dank für Ihren Code, @pwolaq zu entfernen. Deine Änderung hat funktioniert, und ich bin auch umgezogen arr.push (tagideach); Inside if ($ (this) .is (": checked")) {um sicherzustellen, dass das Slicen nur passiert, wenn das Kontrollkästchen aktiviert ist. Aber kannst du bitte die .splice-Funktion erklären und wie die 2 durch ',' getrennten Werte innerhalb von splce hinzugefügt werden? Bitte erkläre auch, warum ich überprüfen sollte, ob der zurückgegebene Wert nicht -1 ist. – user3450590

+0

'indexOf' gibt -1 zurück, wenn Element nicht im Array gefunden wird - wenn ja, dann sollten Sie' splice' nicht verwenden; Das erste Argument von 'splice' ist der Startindex, das zweite ist die Anzahl der zu entfernenden Elemente - Sie sollten das in der Dokumentation lesen – pwolaq

1

Set Elementindex von Array

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

Wie unterscheidet sich das von meiner Antwort? – pwolaq

Verwandte Themen