【问题标题】:Return "True" on Empty jQuery Selector Array?在空的 jQuery 选择器数组上返回“真”?
【发布时间】:2012-04-27 07:23:10
【问题描述】:

我正在努力创建一种更语义化的方式来使用 jQuery 检查元素。使用 $("#element").length > 0 对我来说真的感觉不太好,所以我正在添加自己的选择器以在 .is 中使用:

if($("#element").is(":present")) {
  console.log("It's aliiiveeee!!");
}

这部分很简单,就像这样:

$.extend($.expr[':'],{
    present: function(a) {
        return $(a).length > 0;
    }
});

我想更进一步,使用类似的语法让查看元素是否不存在变得容易:

$.extend($.expr[':'],{
    present: function(a) {
        return $(a).length > 0;
    },
    absent: function(a) {
        return $(a).length === 0;
    }
});

$(function() {
  if($("#element").is(":absent")) {
    console.log("He's dead, Jim.");
  }
});

但这部分很难做到。我认为这是因为我正在缩减返回的元素以获得结果,并且将选择器缩减为 .length === 0 与要求没有 elelements 相同:无论如何它都会返回 false。

我尝试了很多不同的方法来反转事物,并在元素不存在时返回 true,如果存在则返回 false:

return $(a).length === 0;

return !($(a).length > 0);

if(!($(a).length > 0)) { 
  return true;
} 

if($(a).length > 0) { 
  return false;
} else {
  return true;
}

return !!($(a).length === 0);

// etc...

有没有一种简单的方法可以让它在元素不存在时返回 true,如果存在则返回 false?

【问题讨论】:

    标签: javascript jquery jquery-selectors boolean


    【解决方案1】:

    0 在 JavaScript 中是“假的”。

    你可以直接返回!$(a).length

    【讨论】:

    • 虽然这是真的,你可以放任何你想要的东西,如果没有元素,代码将永远不会执行。
    【解决方案2】:

    怎么样:

    if ( !$(a)[0] ) {
        // $(a) is empty
    }
    

    所以,$(a)[0] 检索 jQuery 对象中的第一个元素。如果该元素为空/未定义,则表示 jQuery 对象为空。

    【讨论】:

      【解决方案3】:

      is的定义:

      根据选择器、元素或 jQuery 对象检查当前匹配的元素集,如果这些元素中至少有一个与给定参数匹配,则返回 true。

      问题在于,由于您没有元素,因此您的元素之一不可能匹配某些条件。 jQuery 甚至没有调用你的代码,因为没有元素。

      编辑:稍微澄清一下,您的代码会为对象中的每个元素调用一次(至少在返回 true 之前)。没有元素意味着代码永远不会被调用。 a 在您的代码中始终是一个元素。

      EDIT2:考虑到这一点,这将是present 的更有效实现:

      $.extend($.expr[':'],{
          present: function(a) {
              return true;
          }
      });
      

      【讨论】:

      • 那么,.is 并不是真正设计用于在匹配的选择器集中不存在任何元素时返回 true 吗?我考虑过的另一个选择是使用:if($("#element").is(":not(:present)")) { console.log("He's dead, Jim."); } 但奇怪的是,这也不起作用。
      • @Code Junkie:同样,您没有任何元素可以使用.is(),因此根本不会调用该函数。不管你扔什么选择器,什么都不会发生!
      • 那么可能没有办法在空选择器结果上返回true?
      • 我想我开始明白了。那么,当没有任何东西传递给 jQuery 时,它就不会运行?
      • 哦,第二次编辑非常好!我会试试看。
      【解决方案4】:

      你可以简单地使用

      if(​$('element').length) // 1 or 0 will be returned
      

      $.extend($.expr[':'],{
          present: function(a) {
              return $(a).length;
          }
      });
      
      if($('#element').is(':present'))
      {
          // code for existence
      }
      else
      {
          // code for non-existence
      }
      

      Example.

      【讨论】:

        【解决方案5】:

        考虑到$().is() 在集合为空时甚至不会运行,:present 选择器相当多余。因此,与其玩$.expr[':'],不如扩展$.fn 以包含适当的功能,例如:

        $.fn.extend({
            hasAny: function() {
                return this.length > 0;
            },
        });
        

        $.fn.extend({
            isEmpty: function() {
                return this.length == 0;
            },
        });
        

        我个人会采用这种方法的原因是选择器通常用于检查元素的特定属性(比较 :checked:enabled:selected:hover 等),不是 jQuery 元素集的属性作为一个整体(例如.size().index())。

        用法当然类似于以下内容:

        if ($('#element').isEmpty())
            console.log("He's dead, Jim.");
        

        【讨论】:

        • 是的,这最终可能是一个更好的方法。我主要是在玩所有的选项,看看最好的方法是什么。接下来我会玩这个。 ^^
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 2011-10-15
        • 2010-11-16
        • 1970-01-01
        • 2021-11-21
        • 2023-01-30
        相关资源
        最近更新 更多