【问题标题】:Hide the content based on Children class隐藏基于儿童类的内容
【发布时间】:2022-02-14 01:44:27
【问题描述】:

我需要代码方面的帮助,我有两个具有相同类名的 HTML div 块,并且在一个 div 块中存在一个具有不同类的额外 h2 标记。如果该 div 中不存在 h2 类名,我想隐藏并显示是否存在 h2 类名。请找到我创建的下面提到的代码。

-- 第一个块Div--

<div class="course-content">
    <h2 class="accesshide"></h2>
    <ul class="topics">
        <li class="data-list">Content not to Display</li>
    </ul>
    <div class="row">
        <p>Content to Display</p>
    </div>
</div>

-- 第二块分区--

<div class="course-content">
    <ul class="topics">
        <li class="data-list">Content not to Display</li>
    </ul>
    <div class="single-section">
        <p>Content to Display</p>
    </div>
</div>

-- jQuery 代码--

$(document).ready(function () {
    if ($(".course-content").find(".accesshide")) {
        $(".course-content").find(".topics").show();
    } else if ($(".course-content").find(".single-section")) {
        $(".course-content").find(".topics").hide();
    } 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="course-content">
        <h2 class="accesshide"></h2>
        <ul class="topics">
            <li class="data-list">Content not to Display</li>
        </ul>
        <div class="row">
            <p>Content to Display (this statement is inaccurate)</p>
        </div>
    </div>
    
    <div class="course-content">
        <ul class="topics">
            <li class="data-list">Content not to Display (this statement is inaccurate)</li>
        </ul>
        <div class="single-section">
            <p>Content to Display</p>
        </div>
    </div>

【问题讨论】:

  • 请使用 hasClass() 函数检查 H2 是否有所需的类
  • 您可能想要更改 topics 项目中的文本,因为它们似乎与您要求的逻辑不匹配。
  • 如果块中有.single-section,你需要什么-隐藏或显示.topics块?

标签: javascript html jquery


【解决方案1】:

由于控件是独立事件,因此应单独评估它们。因此,应该使用两个单独的if 块。在下面解决方案的第二个事件中,被选中元素的父元素的第一个子元素被选中隐藏。

$(document).ready(function () {
  if ($(".course-content").find(".accesshide")) {
      $(".course-content > .accesshide").find(".topics").show();
  } 

  // Because both <div> elements have the ".topics" class style applied, the ".single-section" 
  // element is selected and the first child element of the parent element is hidden.
  if ($(".course-content").find(".single-section")) {
      $(".course-content > .single-section").parent().children(':first-child').hide();
  } 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="course-content">
  <h2 class="accesshide"></h2>
  
  <ul class="topics">
      <li class="data-list">Content not to Display</li>
  </ul>
  
  <div class="row">
      <p>Content to Display</p>
  </div>
</div>

<hr>
    
<div class="course-content">
  <ul class="topics">
      <li class="data-list">Content not to Display</li>
  </ul>
  
  <div class="single-section">
      <p>Content to Display</p>
  </div>
</div>

【讨论】:

  • 感谢 Sercan 的解决方案,实际上这段代码按预期工作。非常感谢
  • 1) 如果页面没有需要块,jQuery 对象将代表空的 DOM 元素集,因此您无需将代码包装在 if 语句中。 2).find() 方法get the *descendants* of each element in the current set of matched elements,所以你的代码的第一部分不起作用。该块是可见的,因为它默认是可见的。
【解决方案2】:

使用 CSS 子选择器 (&gt;) 很简单。只需找到属于course-contentaccesshide 子元素的集合,并隐藏其父元素的topics 子元素。

您可以使用后代选择器 ( ) 执行类似的操作,但由于您知道在这种情况下它是子选择器,因此子选择器可能更准确。

MDN's Child Combinator docs.

$(document).ready(function () {
    $('.course-content>.accesshide').parent().find('.topics').hide();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="course-content">
        <h2 class="accesshide"></h2>
        <ul class="topics">
            <li class="data-list">Content not to Display</li>
        </ul>
        <div class="row">
            <p>Content to Display</p>
        </div>
    </div>
    
    <div class="course-content">
        <ul class="topics">
            <li class="data-list">Content not to Display (this should actually be shown - there's no h2 in the parent div)</li>
        </ul>
        <div class="single-section">
            <p>Content to Display</p>
        </div>
    </div>

【讨论】:

  • 感谢 Tibrogargan 的帮助,当 h2 类名不存在时,我想隐藏第二个 div 块。我得到了解决方案。
【解决方案3】:

如果该 div 中不存在 h2 类名,我想隐藏并显示是否存在 h2 类名。

您不需要任何 JS 代码,只需要带有 adjacentgeneral 兄弟组合符的 CSS。例如:

.course-content .topics {
  display: none;
}
.course-content .accesshide + .topics {
  display: block;
}

当您必须使用 jQuery 时,您可以使用相同的逻辑和 .next() 方法(或 .nextAll()):

$(".course-content").find(".topics").hide();
$(".course-content").find(".accesshide").next(".topics").show();  

如果控制块可以在控制块之前和之后,那么最短的方法是使用.siblings()方法。如果您需要在附近有.accesshide 块或.single-section 块的情况下显示.topics 块,则可以在这两种情况下使用此jQuery 方法:

$(document).ready(function () {
    $(".course-content").find(".topics").hide();
    $(".course-content").find(".accesshide, .single-section").siblings(".topics").show();
});
<div class="course-content">
    <ul class="topics">
        <li class="data-list">Content not to Display</li>
    </ul>
    <div class="row">
        <p>There are no special blocks nearby</p>
    </div>
</div>

<div class="course-content">
    <h2 class="accesshide"></h2>
    <ul class="topics">
        <li class="data-list">Show because of the .accesshide block</li>
    </ul>
    <div class="row">
        <p>Case 1</p>
    </div>
</div>

<div class="course-content">
    <ul class="topics">
        <li class="data-list">Show because of the .single-section block</li>
    </ul>
    <div class="single-section">
        <p>Case 2</p>
    </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • 感谢您的帮助 Gleb Kemsarsky。其实我想用 jQuery 隐藏 div 块。
  • 我从你的回答中为这两种情况添加了一个简短的 jQuery 版本。
  • 现在以 classname-"data-list" 存在的内容隐藏在两个块中,但我只想隐藏 classname-"accesshide" 不存在然后 classname-"data-list"应该隐藏。
  • 我刚刚更新了答案
  • 如果我们为类名“accesshide”提供内容,那么内容仍然会正确显示。
猜你喜欢
  • 2014-10-25
  • 2020-05-01
  • 2017-07-30
  • 2023-03-14
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多