【问题标题】:adding HTML to div if next element has a class如果下一个元素有一个类,则将 HTML 添加到 div
【发布时间】:2014-08-21 09:43:58
【问题描述】:

首先是小提琴:http://jsfiddle.net/krish7878/rwz7egdz/1/

我想做的很简单,有两个 div 的类是“panel-heading”,另一个是类“panel-collapse”,那里是两个条件,

条件 1:如果 'panel-collapse' 有类 'collapse' 添加一些 html 到 'panel-heading'

条件 2:如果 'panel-collapse' 有类 'collapse' 添加一些不同的 html 到 'panel-heading'

代码如下:

HTML:

<div class="panel-heading">
Panel Heading
</div><!-- /.panel-heading-->
<div class="panel-collapse collapse">
    Panel Collapse with a just a collapse
</div><!-- /.panel-collapse -->
<br><br>
<div class="panel-heading">
Panel Heading
</div><!-- /.panel-heading-->
<div class="panel-collapse collapse in">
    Panel Collapse with collapse &amp; in 
</div><!-- /.panel-collapse -->

JS代码:

 $( ".panel-heading" ).next().hasClass(".collapse").append( "<i class='fa fa-plus'></i>" );

 $( ".panel-heading" ).next().hasClass(".collapse.in").append( "<i class='fa fa-minus'></i>" );

我很确定我在 js 部分遗漏了一些东西。任何帮助,将不胜感激。

【问题讨论】:

  • 检查您的两个条件的措辞。在我看来,它们很矛盾。
  • 嗨,GregL,他们看起来还不错。如果 panel-collapse 有 'collapse' 类,panel-heading 应该添加一些 html。

标签: javascript jquery html css


【解决方案1】:

您不需要链接nexthasClass。您可以查询next()

$(".panel-heading").next(".collapse:not(.in)")
                   .append("<i class='fa fa-plus'></i>");

$(".panel-heading").next(".collapse.in")
                   .append("<i class='fa fa-minus'></i>");

以上内容在您的小提琴中有效。

关于您最初的解决方案失败的原因,请参阅@cgatian 的回答。

编辑:更新以反映评论:

$(".panel-heading + .collapse:not(.in)").prev().append("<i class='fa fa-plus'></i>");
$(".panel-heading + .collapse.in").prev().append("<i class='fa fa-minus'></i>");

那么为什么会这样呢?我们使用兄弟操作符立即找到所有 .collapse/.collapse.in 元素,然后遍历一个元素并附加到该元素。

【讨论】:

  • 嗨,Darko Z,它们被添加到“panel-collapse”中,它们是否有可能被添加到“panel-heading”中?
  • @user3486430 这是一个稍微不同的问题,这意味着您正在按照以下方式做一些事情:$(".panel-heading").next().is(selector).previous(".panel-heading").append(...) 但这是一个非常垃圾的解决方案,即使它可以工作。最理想的情况是您将遍历 .panel-heading 数组 $(selector).each() 并为每个数组检查下一个是否合适并附加正确的 html。
  • 遍历你的标题更好的原因是你做的选择更少,并且可以保持对元素的引用而不是不断地重新选择。
【解决方案2】:

这个失败的真正原因是因为你使用了:

.hasClass(".collapse")

方法调用中有一个额外的句点。应该是:

.hasClass("collapse")

有类不需要选择器,只需要类名的字符串


更新:

选择器固定后,hasClass() 返回一个布尔值,而不是具有该类的元素。基于@Darko Z 的回答,您需要以下内容。

$( ".panel-heading" ).next(".collapse").append( "<i class='fa fa-plus'></i>" );

 $( ".panel-heading" ).next(".collapse.in").append( "<i class='fa fa-minus'></i>" );

http://jsfiddle.net/brrbq03L/

【讨论】:

  • +1 的实际原因,忘了在我的回答中包含这个:)
  • @cgatian,谢谢指正,不过我改了还是不行。
  • @user3486430 hasClass 返回一个布尔值,因此它永远不会在您的情况下工作。 api.jquery.com/hasClass 你正在尝试对真/假值使用 jquery 方法
  • 是的@DarkoZ 有正确的答案。我仍然觉得应该有更好的方法来做到这一点。
猜你喜欢
  • 2022-07-16
  • 2019-01-16
  • 2020-02-17
  • 1970-01-01
  • 2017-11-21
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
相关资源
最近更新 更多