【问题标题】:Separate show/hide jquery?单独的显示/隐藏jquery?
【发布时间】:2016-09-16 16:44:21
【问题描述】:

我对可折叠的 jquery 代码有疑问。

我想分隔一些 DIV,但如果我单击一个元素,无论是哪个元素,它都会打开所有其他元素。我必须使用更多这些可折叠的东西(大约 40 件,因为一页中有很多版本,我必须保存一些地方)。我想知道如何将 DIV 彼此分开。 这是我的代码:

<script type="text/javascript"
 src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
 $(document).ready(function() {
  $(".flip").click(function() {
   $(".panel").slideToggle("slow");
  });
 });
</script>

<style type="text/css">
div.panel,p.flip {
 margin: 0px;
 padding: 5px;
 text-align: center;
 background: #FFCFF9;
 border: solid 1px #fff;
}

div.panel {
 widht: 50%;
 height: 100px;
 display: none;
}
</style>
</head>
 <div class="panel" id="1">
  <p>Fist panel text</p>
 </div>
 <p class="flip" id="1">1st version</p>
 <div class="panel" id="2">
  <p>Second panel text</p>
 </div>
 <p class="flip" id="2">2nd version</p>

起初我试过这个: http://www.dynamicdrive.com/dynamicindex17/animatedcollapse.htm 但也有一个问题;它只显示第一个DIV的内容,其余的不会下来。我不知道我是否应该命名 DIV(正如您在代码中看到的那样,我已经尝试过),但如果我这样做,我不知道这样做的正确方法是什么。如果可以的话,请帮助我。谢谢!

【问题讨论】:

  • 在您的代码中,单击具有类翻转的任何元素将切换 .panel。你希望有什么样的行为?

标签: jquery html show-hide collapse


【解决方案1】:

这是一个带有工作版本的 JS fiddle。

https://jsfiddle.net/b3bc4yk6/

您的代码不起作用的主要原因是您没有针对要扩展/收缩的 div,而是针对所有这些 div。从 HTML 中可以看出,我为每个面板指定了自己的 ID。

<div class="panel" id="panel-1">
  <p>Fist panel text</p>
 </div>
 <p class="flip" id="1">1st version</p>
 <div class="panel" id="panel-2">
  <p>Second panel text</p>
 </div>
 <p class="flip" id="2">2nd version</p>

还要注意,ID 应该是唯一的,因此翻转元素和面板元素不应具有相同的 ID。

现在在 jquery 中我们可以获取翻转的 ID 并定位到特定的面板。

$(document).ready(function() {
  $(".flip").click(function() {
   $("#panel-" + $(this).attr('id')).slideToggle("slow");
  });
 });

希望有所帮助!

【讨论】:

    【解决方案2】:

    试试这个:

    <script type="text/javascript">
      $(document).ready(function() {
        $(".flip").click(function() {
          $(this).next(".panel").slideToggle("slow");
        });
      });
    </script>
    

    【讨论】:

    • 为此,您必须编辑 HTML 以使面板位于按钮之后。 HTML 的当前状态会打开错误的面板。例如,翻转 1 会打开面板 2,而翻转 2 不会做任何事情,因为没有面板 3。
    • 啊,你是对的。出于某种原因,我的印象是“翻转”在面板之前,但它确实是相反的。因此,使用 .closest() 代替 .next() 是正确的。如果没有 .each() 行,Petre 的答案是正确的。
    【解决方案3】:

    首先,我想提醒您,ID 必须是唯一的。在您的示例中,有两个 id="1" 元素和两个 id="2" 元素。

    您还可以将每个面板/翻转组合包装在容器 div 中。

    HTML:

    <div class="panelContainer">
       <div class="panel">
          <p>Fist panel text</p>
       </div>
       <p class="flip" id="1">1st version</p>
    </div>
    <div class="panelContainer">
       <div class="panel" id="2">
          <p>Second panel text</p>
       </div>
       <p class="flip" id="2">2nd version</p>
    </div>
    

    在您的 js 中,您为每个具有“翻转”类的元素添加了一个点击功能,以切换具有“面板”类的所有元素。

    您要做的是切换与单击的翻转相对应的面板。

    Js:

    <script type="text/javascript">
      $(document).ready(function() {
         $(".flip").each(function(){
            $(this).click(function() {
                   $(this).closest(".panelContainer").find(".panel").slideToggle("slow");
                });
             });
           });
        </script>
    

    尚未测试代码,但您应该了解大致的概念。

    【讨论】:

    • closest 将尝试向上遍历 DOM 树,并具有打开前一个面板而不是单击的“翻转”类下方的面板的效果。
    • 是否有任何理由在翻转元素上调用 each 函数?你不能只使用 $(".flip").click(function() {??
    • @David Jones - 没有理由。您的选择同样有效。
    • @BobbyC - “通过测试元素本身并向上遍历其在 DOM 树中的祖先来获取与选择器匹配的第一个元素。”取自api.jquery.com/closest 这意味着它确实不能按我的预期工作,但出于另一个原因。另一种选择是获取最接近的“.panelContainer”,然后“找到”panelContainer 内的第一个内部“.panel”。我之所以选择这个选项,是因为如果这两个元素不再是兄弟元素,则代码将无法工作。
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2011-02-22
    • 2012-04-15
    相关资源
    最近更新 更多