【问题标题】:Select all <li> that don't have a checked checkbox选择所有没有选中复选框的 <li>
【发布时间】:2013-02-05 11:41:33
【问题描述】:

我有一个&lt;li&gt;s 列表,每个列表中都有一个复选框,我想隐藏所有没有选中复选框的&lt;li&gt;s。

目前我正在这样做,首先隐藏所有&lt;li&gt;s,然后取消隐藏选中复选框的那些,如下所示:

$("#categoryList").find('li').each(function () {
    $(this).addClass("searchhide");
});

$("#categoryList").find("input[type=checkbox][checked]").each(function () {
    $('#id-' + $(this).attr('rel')).removeClass("searchhide");
});

但难道不能以更直接的方式做到这一点,只隐藏那些需要隐藏的东西吗?

 $("#categoryList").find('li').not("input[type=radio][checked]").each(function () {
     $(this).addClass("searchhide");
 });

【问题讨论】:

  • 更简单的看我的代码...! ;)
  • @aSeptik 并不简单,只是塞进一行,可读性较差;)(和slower,请参阅其他注释...)

标签: jquery jquery-selectors checkbox


【解决方案1】:
$('#categoryList li > input[type="checkbox"]')
    .not(":checked")
    .parent()
    .addClass("searchhide");

【讨论】:

    【解决方案2】:

    我建议为此使用filter 函数;

    $('ul li')
        .filter(function() {
            return $(this).find('input:checked').length == 0;
        })
        .addClass('searchhide'); // or .hide()
    

    它只是选择所有 li 元素并过滤集合以仅包含那些包含未经检查的 input 元素的人。

    制作这个简单的jsfiddle 来演示功能。

    包括相关的HTML;

    <ul>
        <li>A <input type="checkbox" checked="checked" /></li>
        <li>B <input type="checkbox" /></li>
        <li>C <input type="checkbox" checked="checked" /></li>
        <li>D <input type="checkbox" /></li>
        <li>E <input type="checkbox" checked="checked" /></li>
        <li>F, li without a checkbox</li>
        <li>G, multiple checkboxes
            <input type="checkbox" checked="checked" />
            <input type="checkbox" />
        </li>
        <li>H <input type="text" value="text field" /></li>
    </ul>
    

    【讨论】:

    • 那个过滤器不太工作,因为它会隐藏一个&lt;li&gt;,其中包含未检查的any &lt;input&gt;。你可能想要return $(this).find('input:checked').length === 0;。 OP 想要隐藏不包含任何选中复选框的 &lt;li&gt;s。
    • @nbrooks “所有具有未选中复选框的
    • ”和“不包含任何选中复选框的
    • ”之间存在差异,但我仍然推荐使用过滤功能。
  • 是的,是有区别的,想要的结果是两者中的后者(诚然问题标题有些歧义,但文字更清晰)。您应该只隐藏不包含选中复选框的&lt;li&gt;s。您的代码甚至会隐藏&lt;li&gt;&lt;input type='text' /&gt;&lt;/li&gt;,因为文本框与:checked 不匹配。
  • 好的,这有点令人困惑,但我调整了答案中的过滤条件。顺便说一句:即使您自己的答案也只会向包含未选中复选框 inputli 元素隐藏/添加一个类。不过,OP似乎已经够满意了……
  • 啊,那是真的……不知怎的忽略了:)。哦,好吧,这似乎已经足够了。为您的回答 +1
  • 【解决方案3】:

    演示http://jsbin.com/usepob/2/

     $('#categoryList li :checkbox:not(:checked)').parent().addClass("searchhide");
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签