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 un LI en fonction de sa position ou contenu dans un DIV ou UL


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 423
    Points : 876
    Points
    876
    Par défaut Supprimer un LI en fonction de sa position ou contenu dans un DIV ou UL
    bonjour,

    j'essaie de modifier un template html dont j'ai pas la main sur le code HTML mais j'ai la possibilité d'ajouté un script javascript.

    Je souhaite supprimer (rentre invisible) le 4eme onglet (donc index=3) d'un UL qui est contenu dans un DIV de class.
    Le DIV n'as pas de ID donc je le sélectionne par sa class.
    Le UL n'a pas de ID non plus, donc je cherche le contenu qui le cible.
    Ce quatrième onglet contient du contenu comportant le mot "Instructors".

    Nom : enlever onglet li.png
Affichages : 115
Taille : 116,7 Ko

    Donc je sélectionne tous les LI dans ma div, je pose la condition de test de caractère et je change la visibilité si ça valide pas l’expression.

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (let li of document.querySelectorAll(".scroll_tab_inner li")) {
        li.style.display = li.textContent === "Instructors" ? "" : "none";
    }


    Mais voilà, ça ne fonctionne pas. Qu'est-ce que j'ai manqué ou fait comme coquille ?
    ça ne remonte aucune erreur (firefox), du coup je nage dans le flou....
    Mon code s'exécute bien car si je mets un alert ou console, ça marche. j'ai vérifié l'orthographe de ma class div, et je vois pas où j'ai fait une erreur.

    avez-vous une idée ?

    Merci de votre aide.

  2. #2
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 423
    Points : 876
    Points
    876
    Par défaut
    j'ai tenté aussi de sélectionner le LI en fonction du LU mais ça ne fonctionne pas non plus.

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for (let li of document.querySelectorAll(".dtlms-tabs-horizontal li")) {
        li.style.display = li.textContent === "Instructors" ? "" : "none";
     
    }


    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
    <ul class="dtlms-tabs-horizontal scroll_tabs_container"><div class="scroll_tab_left_button" style="position: absolute; left: 0px; top: 0px; width: 26px; cursor: pointer; display: none;"></div><div class="scroll_tab_inner" style="margin: 0px; overflow: hidden; white-space: nowrap; text-overflow: clip; font-size: 0px; position: absolute; top: 0px; left: 0px; right: 0px;"><span class="scroll_tab_left_finisher tab_selected scroll_tab_left_finisher_selected" style="display: inline-block;">&nbsp;</span>
    								<li class="scroll_tab_first tab_selected current" style="display: inline-block; zoom: 1; user-select: none;">
    						<a href="javascript:void(0);"><span class="fas fa-book"></span>Curriculum</a>
    					</li>
     
    			<li style="display: inline-block; zoom: 1; user-select: none;">
    				<a href="javascript:void(0);"><span class="fab fa-docker"></span>About</a>
    			</li>
     
    							<li style="display: inline-block; zoom: 1; user-select: none;">
    					<a href="javascript:void(0);"><span class="fas fa-user-circle"></span>Members</a>
    				</li>
    							<li style="display: inline-block; zoom: 1; user-select: none;" class="">
    				<a href="javascript:void(0);"><span class="fas fa-id-card"></span>
    					Instructors				</a>
    			</li>
    							<li style="display: inline-block; zoom: 1; user-select: none;" class="">
    					<a href="javascript:void(0);"><span class="far fa-newspaper"></span>News</a>
    				</li>
    							<li class="scroll_tab_last" style="display: inline-block; zoom: 1; user-select: none;">
    				<a href="javascript:void(0);"><span class="fas fa-star"></span>Reviews</a>
    			</li>
    		<span class="scroll_tab_right_finisher" style="display: inline-block;">&nbsp;</span></div><div class="scroll_tab_right_button" style="position: absolute; right: 0px; top: 0px; width: 26px; cursor: pointer; display: none;"></div></ul>

  3. #3
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 351
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Tu peux utiliser le sélecteur css nth-child pour cibler le bon élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .dtlms-tabs-horizontal :nth-child(5) {
      display: none !important;
    }
    Utilisation de !important à cause du style inline sur la balise html (éviter les styles inlines pour éviter l'utilisation de !important si possible)

    Néanmoins ton code html n'est pas valide, une balise html ul n'accepte que des balises li (ou d'autres balises ul/ol) en enfants directs, il ne devrais pas y avoir de div en enfants directs de ul.
    https://validator.w3.org/

  4. #4
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 472
    Points : 4 673
    Points
    4 673
    Par défaut
    il n'a pas precise s'il avait acces au CSS

    si dans la console, ton code fonctionne, mais pas dans ton script. c'est que ton script est execute trop tot. (soit le fichier est l'un des 1ers a etre charge dans la page, sois le menu est charge dynamiquement plus tard)

    la solution du CSS serait un bonne idee, car ca supprime la problematique du timing : tu peux creer du css qui sera applique dans la page

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const style = document.createElement('style');
    style.textContent = '.dtlms-tabs-horizontal li:nth-of-type(4) { display: none; }';
    document.head.append(style);
    note : j'ai repris ton selecteur (car ca semble etre un selecteur fonctionnel. j'ai juste ajoute le nth-of-type(4) pour ne selectionner que le 4eme) mais dans l'ideal, il faudrait un selecteur le plus precis possible pour eviter d'appliquer du style a des elements que tu ne veux pas
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 085
    Points : 44 684
    Points
    44 684
    Par défaut
    Bonjour,
    je reviens sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    li.style.display = li.textContent === "Instructors" ? "" : "none";
    visiblement dans ton code on voit apparaître des espaces ou des tabulations et cela textContent le prend en compte ce qui fait que ton test sera false.
    Utilise innerText, qui ne retourne pas la même chose, ou textContent.trim().

    Ressources, en anglais car plus compet :


    Ceci étant et comme il a été dit, l’utilisation du sélecteur CSS est surement la meilleur solution à condition d'avoir un code valide ce qui est un impératif pour ne pas avoir de surprise lors du ciblage d'élément via le CSS.

  6. #6
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 423
    Points : 876
    Points
    876
    Par défaut
    bonjour... et
    merci à tous

    J'ai plus ou moins résolu mon problème.

    Alors déjà le .trim() était effectivement utile.
    Par contre la modif de la CSS par le javascript n'a jamais fonctionné (aucun effet, aucune erreur, même avec F5, CTRL F5... tout est resté visible).
    Du coup, j'ai employé la manière forte : suppression de l'élément (avec .remove) et ça fonctionne :

    Code javascript : 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
    //alert("coucou");
        console.log("coucou");
     
        for (let li of document.querySelectorAll(".dtlms-tabs-horizontal li")) {
        li.style.display=li.textContent.trim()==="Instructors" ? "" : "none";
        //console.log("contenu=");
        //console.log(li.textContent.trim());
        var contenu=li.textContent.trim();
        if (contenu=="Instructors") li.style.display="none";
        if (contenu=="Instructors") li.remove();
        if (contenu=="Instructors") console.log("Instructors trouvé!");
    }
     
     
     
     
     
    /

  7. #7
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 351
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par clavier12AZQSWX Voir le message
    Par contre la modif de la CSS par le javascript n'a jamais fonctionné (aucun effet, aucune erreur, même avec F5, CTRL F5... tout est resté visible).
    Oui car css défini via l'attribut style (<li style="display: inline-block;">) a un poids (une priorité) plus importante que le css défini via js, d'où la recommandation d'éviter l'utilisation de l'attribut style. Il faut ajouter !important à ta déclaration css si tu veux surcharger celle définie dans le code html.
    Edit (merci pour la précision NoSmoking): Le style modifié via JavaScript modifie l'attribut style de l'élément.

    Pour en savoir plus sur le poids des sélecteurs (voir notamment "Cas particuliers") : https://www.emmanuelbeziat.com/blog/...-declarations/

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 085
    Points : 44 684
    Points
    44 684
    Par défaut
    Citation Envoyé par clavier12AZQSWX Voir le message
    Par contre la modif de la CSS par le javascript n'a jamais fonctionné (aucun effet, aucune erreur, même avec F5, CTRL F5... tout est resté visible).
    Du coup, j'ai employé la manière forte : suppression de l'élément (avec .remove) et ça fonctionne :
    Cela fait beaucoup de code pour pas grand chose, il te faut penser à la maintenance c'est impératif !


    Citation Envoyé par Pytet Voir le message
    Oui car css défini via l'attribut style (<li style="display: inline-block;">) a un poids (une priorité) plus importante que le css défini via js, d'où la recommandation d'éviter l'utilisation de l'attribut style.
    Le style modifié via JavaScript modifie l'attribut style de l'élément.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <ul class="liste">
      <li style="display:inline-block">un</li>
      <li>deux</li>
      <li>trois</li>
    </ul>
    <script>
    const elem = document.querySelector(".liste li");
    elem.style.color = "red";
    elem.style.display = "none";
    console.log(elem.outerHTML);
    la sortie sera :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <li style="display: none; color: red;">un</li>

    Il faut ajouter !important à ta déclaration css si tu veux surcharger celle définie dans le code html.
    Effectivement, si tu as dans ta feuille de style un :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    li {
      display: block !important;
      color: blue;
    }
    alors le résultat sera que l'élément restera affiché mais écrit en rouge.

  9. #9
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 423
    Points : 876
    Points
    876
    Par défaut
    bonjour,

    comme le code HTML du template n'est pas propre, quand je masquer/supprimer un LI, il y avait un décallage dans le contenu afficher de l'onglet suivant...
    Bref j'ai trouvé une autre méthode plus radicale en jquery (surement convertible en javascript) :

    Code jquery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $("li:contains(Instructors)").remove();
    $('.dtlms-tabs-horizontal-content').has('div.dtlms-title:contains(Instructors)').remove();

    La 1ere exécution supprime l'onglet LI
    Le seconde exécution supprime le div parent (et ses fils) qui contenait le texte affiché quand on cliquait sur le LI (un onglet TAB).

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

Discussions similaires

  1. Récupérer position scroll bar dans une div
    Par abdelmounaime dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/09/2012, 06h51
  2. Réponses: 13
    Dernier message: 08/06/2012, 16h19
  3. Réponses: 3
    Dernier message: 17/03/2010, 13h49
  4. Réponses: 2
    Dernier message: 07/08/2007, 18h41
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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