0

Ich benutze Bootstrap 4 Alpha 6 Version. In meiner Seite habe ich mehrere Kollapsblöcke. Ich möchte das Symbol ändern, wenn der Benutzer diesen Block öffnet/schließt. Wie ich mehrere dieser Blöcke habe ich Klasse verwendet, aber es hat nicht funktioniert. Was habe ich falsch gemacht? P.S. Wenn ich id in JS verwende funktioniert gut, aber wie Sie sehen, ich habe mehrere Kollaps Block und nicht wollen "& einfügen".Bootstrap 4 ändern Symbol im Kollaps

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

Antwort

2

Das Problem ist: Sie alle Ihre button und .collapse Elemente in der gleichen DOM Level sind, was bedeutet, wenn .collapse ‚s shown.bs.collapse oder hidden.bs.collapse Ereignis wird ausgelöst, die $(this).parent() im Ereignishandler Punkt t o .collapse 's übergeordnetes Element - das äußerste, das in Ihrem Code nicht angezeigt wird. Lass es uns als OUTER machen. Wenn Sie dann find, removeClass und addClass auf OUTER aufrufen, werden alle Symbole geändert, weshalb "es nicht funktionierte".

Um dieses Problem zu beheben, müssen Sie einen Einheitenwrapper erstellen, der eine Gruppe von button und .collapse Elementen enthält. Auf diese Weise zeigt $(this).parent() auf die Gruppe und nur das angeklickte Schaltflächensymbol wird geändert.

Ich habe eine jsfiddle für den Fix gemacht, bitte überprüfen.

+0

Es funktioniert gut in Ihrem Beispiel, aber als ich es in meinem Projekt versuchte, hat es nicht funktioniert. Ich habe es in verschiedenen DOM-Level verwendet. Ich aktualisiere meinen Code in der Post. Kannst du das überprüfen? –

+0

@NurzhanNogerbek Ihr Code-Snippet funktioniert gut, bitte überprüfen Sie https://jsfiddle.net/cshao/j6xsrucm/1/ Ich kopiere einfach & kopiere deine HTML und js. Bitte beachten Sie, Bootstrap CSS und JS, FontAwesome JS sollte importiert werden. – shaochuancs

+0

Nun, ich habe einige Teile nicht angezeigt, weil ich dachte, dass sie nicht wichtig sind (Kartenkopf, Kartenblock, d-flex), aber jetzt, als ich den Code in jsfiddle.net überprüft habe, funktioniert es nicht. Schaut euch meinen Beitrag nochmal an. Der vollständige Code. Hast du jetzt irgendwelche Ideen? –