我正在创建一种使用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?
答案 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
}
答案 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)
0
是“虚假的”。
您可以返回!$(a).length
。
答案 4 :(得分:0)
怎么样:
if ( !$(a)[0] ) {
// $(a) is empty
}
因此,$(a)[0]
检索jQuery对象中的第一个元素。如果该元素为null / undefined,则表示jQuery对象为空。