0

J'utilise bootstrap 4 alpha 6 version. Dans ma page j'ai plusieurs blocs d'effondrement. Je veux changer d'icône lorsque l'utilisateur ouvre/ferme ce bloc. Comme j'ai plusieurs de ces blocs, j'ai utilisé la classe mais ça n'a pas marché. Quel est le problème que j'ai fait? P.S. Lorsque j'utilise id dans JS fonctionne bien, mais comme vous le voyez, j'ai plusieurs bloc de collapse et ne veulent pas "copier & coller".Bootstrap 4 changer l'icône dans l'effondrement

html:

<div class="card"> 
    <div class="card-header"> 
     <div class="d-flex align-items-center justify-content-between"> 
       <button data-toggle="collapse" data-target="#collapse-projects" aria-expanded="false" aria-controls="collapse-projects"> 
        <i class="fa fa-eye" aria-hidden="true"></i> 
       </button> 
     </div> 
    </div> 
    <div class="card-block"> 
     <div class="collapse" id="collapse-projects"> 
      ***SOME CONTENT*** 
     </div> 
    </div> 
</div> 

<div class="card"> 
    <div class="card-header"> 
     <div class="d-flex align-items-center justify-content-between"> 
       <button data-toggle="collapse" data-target="#collapse-tasks" aria-expanded="false" aria-controls="collapse-tasks"> 
        <i class="fa fa-eye" aria-hidden="true"></i> 
       </button> 
     </div> 
    </div> 
    <div class="card-block"> 
     <div class="collapse" id="collapse-tasks"> 
      ***SOME CONTENT*** 
     </div> 
    </div> 
</div> 

JS:

$(document).ready(function() { 
      $('.collapse') 
       .on('shown.bs.collapse', function() { 
        $(this) 
         .parent() 
         .find(".fa-eye") 
         .removeClass("fa-eye") 
         .addClass("fa-eye-slash"); 
       }) 
       .on('hidden.bs.collapse', function() { 
        $(this) 
         .parent() 
         .find(".fa-eye-slash") 
         .removeClass("fa-eye-slash") 
         .addClass("fa-eye"); 
       }); 
     }); 

Répondre

2

Le problème est: tous vos button et .collapse éléments sont dans le même niveau DOM, ce qui signifie que lorsque l » shown.bs.collapse.collapse ou hidden.bs.collapse événement est déclenché, le $(this).parent() dans le point de gestionnaire d'événements t o Le parent de .collapse - le parent le plus à l'extérieur qui n'est pas affiché dans votre code. Faisons comme OUTER. Ensuite, lorsque vous appelez find, removeClass etsur OUTER, toutes les icônes seront modifiées, ce qui explique pourquoi "cela n'a pas fonctionné". Pour résoudre ce problème, vous devez créer un wrapper d'unité contenant un groupe d'éléments button et .collapse. De cette manière, $(this).parent() pointe sur le groupe et seule l'icône du bouton cliqué est modifiée.

J'ai fait un jsfiddle pour le correctif, s'il vous plaît vérifier.

+0

Cela fonctionne très bien dans votre exemple, mais quand je l'ai essayé dans mon projet, ça n'a pas marché. Je l'ai utilisé dans différents niveaux DOM. Je mets à jour mon code en post. Peux-tu le vérifier? –

+0

@NurzhanNogerbek votre extrait de code fonctionne bien, s'il vous plaît vérifier https://jsfiddle.net/cshao/j6xsrucm/1/ Je viens de copier et coller votre code HTML et js. S'il vous plaît noter Bootstrap CSS et JS, FontAwesome JS devrait être importé. – shaochuancs

+0

Eh bien, je n'ai pas montré certaines parties parce que je pensais qu'elles ne sont pas importantes (carte-en-tête, carte-bloc, d-flex), mais maintenant quand j'ai vérifié le code dans jsfiddle.net cela ne fonctionne pas. Regardez mon message à nouveau pls. Son code complet. Avez-vous des idées maintenant? –