【问题标题】:Showing/hiding divs based on checkbox using jQuery使用 jQuery 基于复选框显示/隐藏 div
【发布时间】:2011-05-26 15:04:05
【问题描述】:

我有一个带有复选框的表单(包含在标签#contact 中)。对于此复选框的更改操作,我正在显示/隐藏一个 div (#options)。

为了确保如果选中复选框,则始终显示#options div(并避免选中复选框实际上隐藏子选项的情况),我使用以下代码:

$('#contact :checkbox').is(':checked') ? $("#options").show() : $("#options").hide();

这很好用。我遇到的问题是,我想要多个复选框,而不是一个带有 ID 的复选框。我想根据是否选中前一个复选框(在具有类.trigger 的标签内)来显示/隐藏我的.hidden 类的下一个实例。我试过这个:

$(document).ready(function() {
    if( $('.trigger :checkbox').is(':checked') ) {
        $(this).parent().nextAll('ul.hidden').show();
    } else {
        $(this).parent().nextAll('ul.hidden').hide();
    }
});

但无济于事。复选框位于无序列表中,如下所示:

<ul>
  <li><label class="trigger"><input type="checkbox" name="02" /> Trigger 1</label>
      <ul class="hidden">
        <li><label><input type="checkbox" name="02-sub1" /> Normal</label></li>
        <li><label><input type="checkbox" name="02-sub2" /> Normal</label></li>
      </ul>
  </li>
  <li><label><input type="checkbox" name="02" /> Normal</label></li>
  <li><label><input type="checkbox" name="03" /> Normal</label></li>
  <li><label class="trigger"><input type="checkbox" name="04" /> Trigger 2</label>
      <ul class="hidden">
        <li><label><input type="checkbox" name="04-sub1" /> Normal</label></li>
        <li><label><input type="checkbox" name="04-sub2" /> Normal</label></li>
      </ul>
  </li>
</ul>

我看不出我在哪里出错了;大概我的选择器不正确,但我已经使用了很长时间的语法并且没有得到任何地方。在此先感谢(感谢您阅读本文)。

【问题讨论】:

标签: javascript jquery html jquery-selectors


【解决方案1】:

您需要在change 处理程序中运行您的代码,因此this 指的是您想要的复选框,如下所示:

$(document).ready(function() {
   $('.trigger :checkbox').change(function() {
     if( $(this).is(':checked') ) {
       $(this).parent().nextAll('ul.hidden').show();
     } else {
       $(this).parent().nextAll('ul.hidden').hide();
     }
   });
});

...使用.toggle(bool) 可以缩短很多时间,如下所示:

$(function() {
   $('.trigger :checkbox').change(function() {
     $(this).parent().nextAll('ul.hidden').toggle(this.checked);
   });
});

如果您需要它在页面加载时运行,以便显示/隐藏状态与复选框匹配,只需使用 .change().trigger('change') 的快捷方式)调用该 change 处理程序,如下所示:

$(function() {
   $('.trigger :checkbox').change(function() {
     $(this).parent().nextAll('ul.hidden').toggle(this.checked);
   }).change();
});

【讨论】:

  • 您知道我如何将您的上述功能(顺便谢谢您,它完美地回答了我最初的问题)与我当前的更改功能结合起来吗?我在让它们都工作时遇到了真正的问题。
  • @EdM - 老实说,我会将问题回滚到原始问题,因此它是一个更好的资源,并单独询问您的新/大量修改的问题......因为它在回答后代表这样的编辑已发布使问题对那些后来发现它的人来说意义不大。您可以在此处发布一个单独的问题并将其链接,以使事情更整洁吗?
  • 好的,这听起来是个好主意,谢谢。对网站来说非常新,因此了解处理事情的最佳方式很有用。
【解决方案2】:

你知道你可以推出自己的领域,对吧?典型的做法是使用“rel=”字段,该字段在 HTML 中没有意义,但可以在 jquery 中提取和使用。

if ($('#contact :checkbox').is(':checked')) {
    $("#" + $('#contact :checkbox').attr('rel')).show();
} else {
    $("#" + $('#contact :checkbox').attr('rel')).hide();
}

然后:

  <li><label class="trigger"><input type="checkbox" name="04" rel="hidden-04" /> Trigger 2</label>
      <ul class="hidden" id="hidden-04">
        <li><label><input type="checkbox" name="04-sub1" /> Normal</label></li>
        <li><label><input type="checkbox" name="04-sub2" /> Normal</label></li>
      </ul>
  </li>

然后,当名为 04 的复选框被选中时,我们在其 rel 字段中查找对象的 id 为 hide()show()。我认为这比尝试在 dom 中寻找目标对象要容易得多。

【讨论】:

  • 这不能正常工作,因为$('#contact :checkbox').attr('rel') 将返回 first 匹配的rel 属性...并且选择器重复了很多次。看我的回答,这样做相对来说很容易:)
  • 嗯。你是对的——我试图在他提供的代码中工作......真正的解决方案(如果你打算这样做;你的帖子也解决了他的需要)是在 onClick 处理程序中执行此操作绑定到 :checkbox 对象。然后你有一个'this'可以谈论,你可以从那个唯一地获得 rel 属性......
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
相关资源
最近更新 更多