在空jQuery选择器数组上返回“True”?

时间:2012-04-15 21:03:12

标签: javascript jquery jquery-selectors boolean

我正在创建一种使用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与要求没有元素相同:无论如何都返回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?

5 个答案:

答案 0 :(得分:14)

is的定义:

  

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

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

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

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

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

答案 1 :(得分:5)

您只需使用

即可
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

答案 2 :(得分:2)

鉴于集合为空时$().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.");

答案 3 :(得分:1)

JavaScript中的

0是“虚假的”。

您可以返回!$(a).length

答案 4 :(得分:0)

怎么样:

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

因此,$(a)[0]检索jQuery对象中的第一个元素。如果该元素为null / undefined,则表示jQuery对象为空。