jQuery,函数内函数目标错误 div

jQuery, function within function targets wrong div

我有一组对象,我将 div 隐藏在包装器中,它还有一个子 <a> 按钮,可以切换隐藏对象的 slideDown 效果。但是,当单击它时,它只打开最后一个对象中隐藏的 div,而不是仅在 ITS 子对象中打开

简化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);

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>

您的代码太复杂了。

这里有一个更简单的:

$(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>