Löschen Sie bestimmte li-Elemente mit JavaScript

8

Die Funktion scheint die Node , die den angegebenen Wert enthält, nicht zu löschen, es sei denn, sie ist der erste Wert (in diesem Fall 'Äpfel'). Die for-Schleife muss auch vor dem Löschen jeder Art zweimal ausgeführt werden. Warum ist das so?

%Vor%

Das entsprechende HTML:

%Vor%     
Nahmed39 02.01.2017, 05:22
quelle

6 Antworten

13

childNodes gibt eine Liste von allen untergeordneten Knoten zurück. Dazu gehören Textknoten . Zwischen jedem Element <li> haben Sie einen Textknoten, der Leerzeichen und einen Zeilenumbruch enthält. Also gibt childNodes eine Liste von 9 Knoten zurück, aber Sie nehmen eine Liste von 4 Knoten an ( document.getElementsByClassName('fruit').length ).

Sie könnten .children verwenden anstelle von .childNodes . .children gibt eine Liste von nur Elementknoten zurück. Oder noch besser, verwenden Sie elements , da Sie das gerade durchlaufen.

Sie müssen auch aufhören zu iterieren, nachdem Sie einen Knoten entfernt haben, sonst versuchen Sie, auf eine Position zuzugreifen, die nicht mehr existiert.

%Vor% %Vor%

Es gibt noch andere Dinge, die verbessert werden könnten (z. B. warum man checker nicht einen tatsächlichen booleschen Wert zuweist), aber sie sind nicht mit Ihrer Frage verbunden.

    
Felix Kling 02.01.2017 05:46
quelle
1

Anstelle von for loop können Sie darüber nachdenken, wie Sie dies tun können.

Überprüfen Sie dieses Snippet

%Vor% %Vor%

Hoffe es hilft

    
Geeky 02.01.2017 05:46
quelle
1

Das hört sich vielleicht verrückt an, aber Chrome scheint Ihre HTML-Liste ungeordnet in folgende Punkte zu zerlegen:

%Vor%

Im Wesentlichen scheint es, dass Sie für jede neue Zeile innerhalb des Tags einen Textknoten in Ihrer ungeordneten Liste erstellen. Dies erklärt auch, warum das Löschen erst erfolgt, nachdem Sie die Funktion ein zweites Mal aufgerufen haben - sie löscht zuerst den Textknoten und löscht dann das eigentliche Element beim zweiten Versuch.

Einfaches Konvertieren Ihres HTML in die folgende Form löst das Problem (ist aber nicht sehr hübsch):

%Vor%

Es gibt einige Problemumgehungen, die Sie ausprobieren können. Beispielsweise könnten Sie stattdessen versuchen, die Methode childNode.remove () zu verwenden. obwohl nicht alle Browser dies unterstützen.

Alternativ könnte auch so etwas funktionieren:

%Vor%     
KnightNiwrem 02.01.2017 05:52
quelle
0

Ich führe diesen Code aus. Sie sollten diese Zeile hinzufügen

%Vor%

anstelle dieser Zeile

%Vor%     
Shaybi 02.01.2017 05:37
quelle
0

hier ist das Problem in myList.removeChild(myList.childNodes[ (counter) ]); , weil myList.childNodes Knoten 8 Werte anstelle von 4 zurückgibt. Wir haben Elemente Array mit 4 Knoten, daher liefert das Entfernen von Elementen Array ein richtiges Ergebnis

Probieren Sie das unten stehende Code-Snippet aus,

%Vor%     
selvassn 02.01.2017 05:48
quelle
0

myList ist ein Array von li element, also ist removeChild auf myList logisch nicht korrekt.

Auch myList.childNodes macht hier keinen Sinn.

Versuchen Sie

%Vor%     
Achal Saini 02.01.2017 05:41
quelle

Tags und Links