【问题标题】:jQuery Show/Hide element based on ConditionjQuery 根据条件显示/隐藏元素
【发布时间】:2016-12-01 21:02:51
【问题描述】:

好的。我已经低于代码。我想要执行的是,单击链接后,显示/隐藏(切换)非常 NEXT div 具有类名subsec 并隐藏所有其他具有类名subsec 的 div。此外,单击链接外的任意位置并打开 div (div.subsec),隐藏后者 (div.subsec)。

$(".links").on("click", function(){

 $(this).next("div.subsec").toggle("slow");

});
.subsec{
  display: none;
}

.mainDivs{
  float: left;
	padding: 25px;
}

li{
 border: 2px solid blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mainDivs">

<a href="javascript:void(0);" class="links">Link 1</a>

<div class="subsec">
<ul>
  <li>11</li>
  <li>12</li>
</ul>
</div>

</div>

<div class="mainDivs">

<a href="javascript:void(0);" class="links">Link 2</a>

<div class="subsec">
<ul>
  <li>21</li>
  <li>22</li>
</ul>
</div>

</div>

Fiddle

Toggle 方法效果很好,但需要在单击任何其他链接或文档中链接/打开的 div 之外的任何位置时关闭以前打开的 div (div.subsec)。

实现的最佳方法是什么?提前致谢。干杯!!

【问题讨论】:

  • 尽可能地尝试制作一个有效的sn-p。这很方便,因为外部链接可能会变得陈旧,并且拥有有效的 sn-p 可以让您更有机会获得帮助。

标签: javascript jquery html css toggle


【解决方案1】:

您需要定位所有其他 subsec 元素并隐藏它们。您可以通过使用类 subsec 定位所有元素并使用 :not 选择器过滤掉目标 subsec 来做到这一点:

var subsec = $("div.subsec");
$(".links").on("click", function(){
   var target = $(this).next("div.subsec");
   subsec.not(target).hide('slow')
   target.toggle("slow");
});

Working Demo

【讨论】:

  • 打败我!该死!
  • @Milind 但如果我点击外部,它不会隐藏打开的 div。
  • @JensonMJohn 您可以收听您的 或文档来处理这种情况,只需确保在“.links”的点击事件上停止传播
【解决方案2】:

你可以在onclick监听文档来监听所有的点击。

我会检查我点击的内容是否已点击,并确定是否要保留,然后隐藏其他所有内容。

我在每张支票中都添加了 cmets,例如,如果您想要它,以便当您在 .subsec 内单击时,您可以注释掉该部分……等等。

$(".links").on("click", function(){
 $(this).next("div.subsec").toggle("slow");
});

$(document).on('click', function (e) {
  var $e = $(e.target);
  var keep;
  //if the link is clicked, keep the next .subsec
  if ($e.is('a')) keep = $e.next();
  //if we click inside a .subsec, also keep
  if ($e.is('.subsec')) keep = $e;
  //if our parent is a .subsec keep too
  var $c = $e.closest('.subsec');
  if ($c.length) keep = $c;  
  //now we know what we want to keep, lets hide others
  $('.subsec').not(keep).hide('slow')       
});
.subsec{
  display: none;
}

.mainDivs{
  float: left;
	padding: 25px;
}

li{
 border: 2px solid blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mainDivs">

<a href="javascript:void(0);" class="links">Link 1</a>

<div class="subsec">
<ul>
  <li>11</li>
  <li>12</li>
</ul>
</div>

</div>

<div class="mainDivs">

<a href="javascript:void(0);" class="links">Link 2</a>

<div class="subsec">
<ul>
  <li>21</li>
  <li>22</li>
</ul>
</div>

</div>

【讨论】:

  • 这就是我想要的!!谢谢队友..干杯!!
【解决方案3】:

您好,请尝试以下代码。

var _clicked = false;
$(".links").on("click", function(){
 $(".subsec").hide("slow");
 $(this).next("div.subsec").toggle("slow");
$(window).off("click",onWindowClick);
$(window).on("click",onWindowClick);
_clicked = true;

});
function onWindowClick(e)
{
if(!_clicked && !(e.target.parentNode && e.target.parentNode.parentNode && e.target.parentNode.parentNode.className =='subsec' ))
   {
     $(".subsec").hide("slow");
     $(window).off("click",onWindowClick);
   }
   _clicked = false;

}

【讨论】:

  • 你有没有注意到它甚至隐藏了打开的div的点击??
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多