【问题标题】:jquery filtering has + notjquery过滤有+没有
【发布时间】:2011-05-02 00:28:26
【问题描述】:

好的,我有列表项,有些有跨度,有些没有。
在我的活动中,我想在他们还没有跨度时添加。

has() 工作正常,但not() 将跨度添加到两者??

HTML:

<ul>
    <li>
        <p>item</p>
        <span class="spn">empty span</span>
    </li>
    <li>
        <p>item 2</p>
    </li>
<ul>
<hr>
<a class="add-span"href="#">check</a>

JS:

$("a.add-span").click(function() {
    $("li").each(function(index) {
        // $(this).has("span").find("span").append(" - appended");
        $(this).not("span").append('<span class="spn">new span<\/span>');
    })    
})

【问题讨论】:

标签: jquery jquery-selectors filtering


【解决方案1】:
$("a.add-span").click(function() {
    $("li").each(function(index) {
       if ($(this).children('span').length === 0){
         $(this).append('<span class="spn">new span<\/span>');
       }
    })    
})

使用children() 方法,length 属性用于检查span 是否已经存在,如果没有,则添加/附加一个。

更多信息:

【讨论】:

  • 你不是说if($(this).children('span') ...吗?但除此之外,+1。也没想到那个方法。 =)
  • @Jeff Rupert:没错,是children,我没有关注他的选择器。谢谢
  • @Sarfraz... 在选择器中为每个函数指定会更容易...IE $("li:not(:has(span))").each(. ..)
  • @John Hartsock:同意,但在撰写本文时我并没有想到它,实际上这更好:)
  • 感谢您挖掘此解决方案。
【解决方案2】:

您可以像这样使用:not:has 选择器的组合

$("a.add-span").click(function() {
    $("li:not(:has(span))").each(function(index) {
        $(this).append('<span class="spn">new span<\/span>');
    });
});

这是demohttp://www.jsfiddle.net/xU6fV/

【讨论】:

  • @FFish ...这是一个更清洁的解决方案
  • not 和 has 的完美组合,最后我选择 Sarfraz 选项,因为我在每个循环中都有另一个过滤器,谢谢!
  • 我想要反转它。有可能吗?
  • @vipulsorathiya 你的意思是你想在一个里面有一个 span 标签的 li 下找到元素?
  • @vipulsorathiya 应该是 $("li:has(span)")
【解决方案3】:

如果您不想只过滤掉那些确实将spans 作为直接子代的元素,那么接受的答案效果很好。

:has().has() 循环遍历所有后代,而不仅仅是子代。

在这种情况下,你必须使用一个函数

$("li").not(function() {
    // returns true for those elements with at least one span as child element
    return $(this).children('span').length > 0 
}).each(function() { /* ... */ })

【讨论】:

    【解决方案4】:

    试试这个,

    $("a.add-span").click(function() {
        $("li:not(:has(span))").each(function(index) {
            $(this).append($("<span class='spn'>").html("Newly Added Span"));
        });
    });
    

    【讨论】:

      【解决方案5】:

      这是在 Google 上搜索“jquery not has”时的第一个链接。我需要解决的具体场景与这个有点不同。我必须 not 具有特定 DOM 元素的项目,而不仅仅是基于标签。这意味着我不能使用上述每个解决方案都使用的选择器。

      jQuery 的 has() 但是确实接受 DOM 元素!所以我创建了一个 jQuery 插件来结合这两个内置函数。

      我想在这里分享它,因为希望它也能在我的情况下对其他人有所帮助。它也回答了最初的问题。

      插件:

      (function ( $ ) {
          $.fn.extend({
              not_has: function (param) {
                  return this.not(this.has(param));
              }
          });
      }( jQuery ));
      

      实施:

      $("a.add-span").click(function() {
          $("li").not_has("span")
          .append('<span class="spn">new span<\/span>');
      
          // Prevent the page from navigating away
          return false;
      });
      

      https://jsfiddle.net/brjkg10n/1/


      我最初打算找到一个 jQuery 函数,它可以像 addBack() 一样工作,但改用 not。如果您需要如此复杂的东西,请随意使用以下插件。

      (function ( $ ) {
          $.fn.extend({
              notBack: function () {
                  return this.prevObject.not(this);
              }
          });
      }( jQuery ));
      

      有了这个,答案将是:

      $("li").has("span").notBack()
      .append('<span class="spn">new span<\/span>');
      

      https://jsfiddle.net/2g08gjj8/1/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 2013-06-30
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多