IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Supprimer des éléments d'une liste


Sujet :

JavaScript

  1. #1
    Membre du Club
    Femme Profil pro
    sans emploi
    Inscrit en
    Décembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2019
    Messages : 6
    Par défaut Supprimer des éléments d'une liste
    Bonjour,

    je me remets sur un exercice sur lequel je travaillais il y'a une dizaine de jours.
    je travaille sur un exercice ou j'ajoute des éléments d'une liste puis je supprime certains éléments d'entre eux choisis à l'aide de boutons radio.
    la suppression est aléatoire, je peux en cocher 2 qui seront supprimés et le coup d'après juste un sur 2 qui sera supprimé.

    est ce que ma logique est fausse ou est ce que il y'a des subtilités js quand on essaye de supprimer plusieurs éléments suite à un clic.
    vous verrez dans le code des icônes en trop, par ce que je teste un peu et que je prépare la question suivante.

    Merci.
    le js et le css ne sont pas dans un fichier à part.

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
        <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
     
        <style>
            li{
                display : inline-block;
                width: 200px;
            }
            .direction{
                display: inline-block;
                position: relative;
                bottom: -9px;
            }
        </style>
    </head>
    <body>
     
        <i class="material-icons">home</i>
        <i class="material-icons">cloud</i>
        <i class="material-icons">delete</i>
        <i class="material-icons">search</i>
     
     
        <ul id="liste">
     
     
        </ul>
        <form action="#">
            <input type="text" id= "champsdetexte">
            <button id="ajout"> ajouter</button>
            <button id="supprime">supprimer</button>
            <div class="direction">
                <i class="fa fa-caret-up" style="font-size:48px;color:green"></i>
                <i class="fa fa-caret-down" style="font-size:48px;color:green"></i>
            </div>
     
     
        </form>
     
     
        <script>
        let bouton = document.getElementById('ajout');
        var champsdetexte = document.getElementById('champsdetexte');
        var ul = document.getElementById('liste');
        var i=0;
        bouton.addEventListener('click',function(e){
            if(champsdetexte.value==""){
                e.preventDefault();
                alert('veuillez entrer des caractères dans le champs');
            }else{
                var div = document.createElement('div');
                var li = document.createElement('li');
                var mots = document.createTextNode(champsdetexte.value);
                let inp = document.createElement('input');
                inp.setAttribute("type","checkbox");
                let nomvar = "radio"+i;
                inp.setAttribute("name",nomvar);
                inp.setAttribute("id",nomvar);
                i++;
                li.appendChild(mots);
                div.appendChild(li);
                div.append(inp);
                ul.append(div);
                champsdetexte.value = "";
            }
        });
        let supprime = document.getElementById('supprime');
        let baliseInput = document.getElementsByTagName("input");
        supprime.addEventListener('click', function(){
            //let verifier = false;
            //console.log("this",this);
            for(let i=0; i<baliseInput.length; i++){
                //console.log("tour de boucle", i);
                if(baliseInput[i].checked){
                    console.log("test if", i);
                    let parent = baliseInput[i].parentNode;
                    //console.log("parent de ", i);
                    ul.removeChild(parent);
                    //console.log("apres suppression" , i);
                }
            }
        });
        </script>
    </body>
    </html>

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    pour éviter de "soumettre" le formulaire, il faut des <button type="button"> (sinon, par défaut, c'est "submit") :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            <button type="button" id="ajout"> ajouter</button>
            <button type="button" id="supprime">supprimer</button>
    Et, en l'occurrence, on peut supprimer les balises <form> </form>.

    Ensuite, tu devrais mettre une classe sur les <input type="checkbox"> * : ce serait plus simple à cibler.
    * que tu appelles improprement "radio".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        inp.type ="checkbox";
        inp.classList.add("checkdelete");
    Dernière modification par ProgElecT ; 30/12/2019 à 11h40.

  3. #3
    Membre du Club
    Femme Profil pro
    sans emploi
    Inscrit en
    Décembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2019
    Messages : 6
    Par défaut
    Bonjour jreaux62,

    merci pour ton aide.
    je sais que mon code laisse à désirer, qu'il faudra que je revois les subtilités des formulaires.
    je prenais séquentiellement ce qui m'intéressait via des recherches google de bouts de code.

    si mon programme ne fonctionne pas correctement, cela vient de la boucle for, non?

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
        <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
     
        <style>
            li{
                display : inline-block;
                width: 200px;
            }
            .direction{
                display: inline-block;
                position: relative;
                bottom: -9px;
            }
        </style>
    </head>
    <body>
     
        <i class="material-icons">home</i>
        <i class="material-icons">cloud</i>
        <i class="material-icons">delete</i>
        <i class="material-icons">search</i>
     
     
        <ul id="liste">
     
     
        </ul>
        <form action="#">
            <input type="text" id= "champsdetexte">
            <button type="button" id="ajout"> ajouter</button>
            <button type="button" id="supprime">supprimer</button>
            <div class="direction">
                <i class="fa fa-caret-up" style="font-size:48px;color:green"></i>
                <i class="fa fa-caret-down" style="font-size:48px;color:green"></i>
            </div>
     
     
        </form>
     
     
        <script>
        let bouton = document.getElementById('ajout');
        var champsdetexte = document.getElementById('champsdetexte');
        var ul = document.getElementById('liste');
        var i=0;
        bouton.addEventListener('click',function(e){
            if(champsdetexte.value==""){
                e.preventDefault();
                alert('veuillez entrer des caractères dans le champs');
            }else{
                var div = document.createElement('div');
                var li = document.createElement('li');
                var mots = document.createTextNode(champsdetexte.value);
                let inp = document.createElement('input');
                inp.setAttribute("type","checkbox");
                inp.classList.add('checkdelete');
                let nomvar = "checkbox"+i;
                inp.setAttribute("name",nomvar);
                inp.setAttribute("id",nomvar);
                i++;
                li.appendChild(mots);
                div.appendChild(li);
                div.append(inp);
                ul.append(div);
                champsdetexte.value = "";
            }
        });
        let supprime = document.getElementById('supprime');
        let baliseInput = document.getElementsByClassName('checkdelete');
        
        supprime.addEventListener('click', function(){
            //let verifier = false;
            //console.log("this",this);
            for(let i=0; i<baliseInput.length; i++){
                //console.log("tour de boucle", i);
                if(baliseInput[i].checked){
                    //console.log("test if", i);
                    let parent = baliseInput[i].parentNode;
                    //console.log("parent de ", i);
                    ul.removeChild(parent);
                    //console.log("apres suppression" , i);
                }
            }
        });
        </script>
    </body>
    </html>

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        let supprime = document.getElementById('supprime');
     
        supprime.addEventListener('click', function(){
            let baliseInput = document.getElementsByClassName('checkdelete');
    ...

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 982
    Par défaut
    Et si tu remplaces:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(let i=0; i<baliseInput.length; i++)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(let i = baliseInput.length - 1; i >= 0; i--)
    ça donne quoi?

  6. #6
    Membre du Club
    Femme Profil pro
    sans emploi
    Inscrit en
    Décembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2019
    Messages : 6
    Par défaut
    merci jreaux62 et CosmoKnacki, ça semble marcher. Merci.

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    Citation Envoyé par CosmoKnacki
    ...
    ça donne quoi?
    il me semble intéressant de noter le pourquoi.

    Les méthodes document.getElements.......() renvoient une HTMLCollection.

    Une HTMLCollection est une liste dynamique de noeuds, elle est automatiquement mise à jour en cas de suppression/ajout d'éléments, correspondant aux critères, dans le DOM, en d'autres termes tout changement dans le DOM affecte le contenu de la Collection.

    La méthode Node.querySelectorAll() renvoie une NodeList.

    Une NodeList est une liste, collection statique de noeuds, elle n'est pas mise à jour en cas de suppression/ajout d'éléments, en d'autres termes tout changement dans le DOM n'affecte pas le contenu de la NodeList.

    En partant de ce code HTML simple
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ul>
      <li>1
      <li class="pair">2
      <li>3
      <li class="pair">4
      <li>5
      <li class="pair">6
    </ul>
    ... en passant par une HTMLCollection on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // HTMLCollection
    const elements = document.getElementsByClassName("pair");
    while(elements[0]){
      elements[0].remove()
    }
    console.log(elements); // > HTMLCollection*[] ou HTMLCollection { length: 0 }
    ... en passant par une NodeList on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // NodeList
    const elements = document.querySelectorAll(".pair");
    elements.forEach((el) => el.remove());
    console.log(elements); // > NodeList(3)*[li.pair, li.pair, li.pair]
    Le résultat est le même, le mode opératoire non.

    Pour info : remove et forEach sur les NodeList ne sont pas supportés par IE.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. parcourir une liste et supprimer des éléments selon une condition
    Par jean-pat dans le forum Général Python
    Réponses: 17
    Dernier message: 17/03/2017, 22h07
  2. Supprimer des élément d'une liste
    Par abbescr7 dans le forum Général Java
    Réponses: 8
    Dernier message: 08/01/2016, 15h35
  3. [Prototype] Supprimer des éléments d'une liste
    Par baggie dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 05/06/2012, 12h22
  4. Réponses: 7
    Dernier message: 23/04/2008, 10h21
  5. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo