2016-05-20 8 views
0

Ich habe eine Reihe von Objekten, wo ich div im Wrapper versteckt, die alos hat eine <a> Schaltfläche, die einen SlideDown-Effekt auf das versteckte Objekt schaltet. Doch angeklickt, wenn es öffnet sich nur die versteckte div in dem letzten Objekt, statt nur in ITS KindjQuery, Funktion innerhalb Funktion Ziele falsch div

Vereinfachtes HTML:

<div class="panel-compressed"> 
    <div class="panel-header"> 
    <div class="toggle-panel"> 
     <a href="#" class="toggle-panel-btn">Open content</a> 
    </div> 
    </div> 
    <div class="panel-body"> 
     <p>Content goes here</p> 
    </div> 
</div> 

<div class="panel-compressed"> 
    <div class="panel-header"> 
    <div class="toggle-panel"> 
     <a href="#" class="toggle-panel-btn">Open content</a> 
    </div> 
    </div> 
    <div class="panel-body"> 
     <p>Content goes here</p> 
    </div> 
</div> 

<div class="panel-compressed"> 
    <div class="panel-header"> 
    <div class="toggle-panel"> 
     <a href="#" class="toggle-panel-btn">Open content</a> 
    </div> 
    </div> 
    <div class="panel-body"> <!-- THIS OPENS WHEN CLICKING ANY .toggle-panel-btn --> 
     <p>Content goes here</p> 
    </div> 
</div> 

JS:

var $panelToggle = $('.toggle-panel-btn'); //Toggle button 
var $panelBody = $('.panel-body'); //Hidden content 
var $panelCompressed = $('.panel-compressed') //Wrapper 

function togglePanel(){ 
     $this = $(this); 
     $this.find($panelBody).hide(); 
     //Open .panel-body 
     function showPB() { 
      $this.find($panelBody).slideDown(); 
      $this.find($panelToggle).one("click", hidePB); 
      $this.addClass('dropdown-open'); 
     } 

     //close .panel-body 
     function hidePB() { 
      $this.find($panelBody).slideUp(); 
      $this.find($panelToggle).one("click", showPB); 
      $this.removeClass('dropdown-open'); 
     } 
     $this.find($panelToggle).click("click", showPB); 
    } 

    $panelCompressed.each(togglePanel); 
+2

Bei der Verwendung von 'find' wie' $ this.find ($ panelBody) 'die Wähler wie' this.find $ passieren (‘ .panel-body ') ' – Satpal

+0

ist dies, weil die Variable außerhalb der Funktion ist? –

+1

ist es, weil 'var $ panelBody = $ ('. Panel-body');' außerhalb der Funktion findet alle panelbodies, nicht nur die Sie suchen. Um Ihren Code zu verstecken, müssten Sie den $ panelBody durchlaufen und den Elternteil finden, der mit $ (this) übereinstimmt. – mplungjan

Antwort

1

Ihr Code ist viel zu komplex.

Hier ist eine einfachere:

$(function() { 
 
    $('.panel-compressed .toggle-panel-btn').on("click",function(e) { 
 
    e.preventDefault(); // cancel link click 
 
    $(this).closest(".panel-compressed") 
 
     .toggleClass("dropdown-open") 
 
     .find('.panel-body').slideToggle(); 
 
    }); 
 
});
.panel-body { display:none } 
 
.dropdown-open { background-color:pink }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="panel-compressed"> 
 
    <div class="panel-header"> 
 
    <div class="toggle-panel"> 
 
     <a href="#" class="toggle-panel-btn">Open content</a> 
 
    </div> 
 
    </div> 
 
    <div class="panel-body"> 
 
     <p>Content goes here</p> 
 
    </div> 
 
</div> 
 

 
<div class="panel-compressed"> 
 
    <div class="panel-header"> 
 
    <div class="toggle-panel"> 
 
     <a href="#" class="toggle-panel-btn">Open content</a> 
 
    </div> 
 
    </div> 
 
    <div class="panel-body"> 
 
     <p>Content goes here</p> 
 
    </div> 
 
</div> 
 

 
<div class="panel-compressed"> 
 
    <div class="panel-header"> 
 
    <div class="toggle-panel"> 
 
     <a href="#" class="toggle-panel-btn">Open content</a> 
 
    </div> 
 
    </div> 
 
    <div class="panel-body"> <!-- THIS OPENS WHEN CLICKING ANY .toggle-panel-btn --> 
 
     <p>Content goes here</p> 
 
    </div> 
 
</div>

+0

Prost, das ist offensichtlich besser . Ich habe vergessen, dass die Folien schon eine Toggle-Funktion hatten :). Jedoch für mich wurde jeder '.panel-body' (vielleicht etwas mit meinem html) unter dem Element umgeschaltet, änderte .find zu .children es: ' var $ panelBody = $ (this) .closes ('. Panel-compressed') .children ('. panel-body'). slideToggle(); ' –

+0

Wenn der HTML-Code derselbe ist wie der von Ihnen gepostete, funktioniert find genauso wie Kinder, es sei denn, Sie haben mehr als einen Hauptteil. Ich habe die Klasse jetzt auch dem Elternteil hinzugefügt – mplungjan

1

var $panelCompressed = $('.panel-compressed') //Wrapper 
 

 
function togglePanel(){ 
 
    var $this = $(this); 
 
    var $panelBody = $this.find('.panel-body').hide(); 
 
    var $panelToggle = $this.find('.toggle-panel-btn'); 
 
    
 
    //Toggle .panel-body 
 
    function togglePB() { 
 
     $panelBody.slideToggle(); 
 
     $this.toggleClass('dropdown-open'); 
 
    } 
 

 
    $panelToggle.click(togglePB); 
 
} 
 

 
$panelCompressed.each(togglePanel);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="panel-compressed"> 
 
    <div class="panel-header"> 
 
    <div class="toggle-panel"> 
 
     <a href="#" class="toggle-panel-btn">Open content</a> 
 
    </div> 
 
    </div> 
 
    <div class="panel-body"> 
 
     <p>Content goes here</p> 
 
    </div> 
 
</div> 
 

 
<div class="panel-compressed"> 
 
    <div class="panel-header"> 
 
    <div class="toggle-panel"> 
 
     <a href="#" class="toggle-panel-btn">Open content</a> 
 
    </div> 
 
    </div> 
 
    <div class="panel-body"> 
 
     <p>Content goes here</p> 
 
    </div> 
 
</div> 
 

 
<div class="panel-compressed"> 
 
    <div class="panel-header"> 
 
    <div class="toggle-panel"> 
 
     <a href="#" class="toggle-panel-btn">Open content</a> 
 
    </div> 
 
    </div> 
 
    <div class="panel-body"> <!-- THIS OPENS WHEN CLICKING ANY .toggle-panel-btn --> 
 
     <p>Content goes here</p> 
 
    </div> 
 
</div>

+0

Es funktioniert, sieht aber sehr ineffizient aus – mplungjan

+0

@mplungjan Ich habe meine Antwort aktualisiert, danke) –

Verwandte Themen