如何检测选择器返回null?

14 浏览
0 Comments

如何检测选择器返回null?

如何检测jQuery选择器返回的是否是一个空对象的最佳方法?

如果你执行以下代码:

alert($('#notAnElement'));

你会得到[object Object],所以我现在的做法是:

alert($('#notAnElement').get(0));

这将输出"undefined",然后你可以对其进行检查。但这种方式似乎很糟糕。还有其他方法吗?

0
0 Comments

如何检测选择器是否返回null?

当选择器返回一个jQuery对象数组时,如果没有找到匹配的元素,它会返回一个空数组。你可以通过检查选择器返回的集合的长度.length,或者检查第一个数组元素是否为'undefined'来判断。

你可以在IF语句中使用以下任何一个示例,它们都会产生相同的结果。如果选择器找到了匹配的元素,则返回True,否则返回False。

$('#notAnElement').length > 0
$('#notAnElement').get(0) !== undefined
$('#notAnElement')[0] !== undefined

我通常使用.length,除非代码热点。这是最清晰明确的方式。另外,.size()已经被废弃多年(自1.8版本起)。我将编辑你的答案并删除它,如果需要可以添加一个注释,但它太旧了,我认为最好删除。

从技术上讲,它返回一个不包含DOM节点的jQuery对象。说它返回一个空数组是不正确的。

0
0 Comments

问题的出现原因:

在上述代码中,通过使用jQuery选择器$("#anid")来查找一个具有id为"anid"的元素。如果找到了匹配的元素,那么长度属性length将会大于0,就会执行alert("element(s) found")代码块。否则,长度属性length将为0,就会执行alert("nothing found")代码块。问题在于,如果选择器没有找到任何匹配的元素,那么返回的值将是null,而不是长度为0的jQuery对象。

解决方法:

为了解决这个问题,我们可以使用length属性来判断选择器是否返回了null。如果返回的是null,那么length属性将为undefined,我们可以通过判断返回的值是否为undefined来确定是否找到了匹配的元素。

以下是修改后的代码:

if ( $("#anid").length !== undefined ) {
  alert("element(s) found")
} 
else {
  alert("nothing found")
}

0
0 Comments

如何检测选择器是否返回null?

使用jQuery扩展来解决这个问题:

$.fn.exists = function () {
    return this.length !== 0;
}

使用方法:

$("#notAnElement").exists();

这个扩展比使用length更明确。

为什么要将'this'包裹在$()中?在这种情况下,'this'实际上指的是jQuery对象吗?

我发现返回this比返回true更有帮助。可以参考我转换Rails的'presence'方法的答案。

如果想保持链式调用的能力,函数应该返回true,或者如果想将this赋值给一个变量,可以参考CSharp的返回语句的修改建议

Magnar,请解释一下这个“扩展”函数是如何工作的?我假设这是一个JavaScript的概念,而不是严格的jQuery概念。我研究了原型链,但不确定是否适用于这里,以及为什么语法会是“$.fn”。

非常简单。没有比这更简单的了。谢谢。

如果你需要使用元素来做其他事情,那么这样会导致2次DOM遍历吗?

if($("#anElement").exists()) { $("#anElement").doSomething(); }

是的。但在这种情况下,你应该省略exists-check,因为jQuery会自动判断是否有匹配的元素来执行操作。

如果函数返回$this或false,可以通过以下方式进行一次遍历:

let theThing = $("#anElement").exists(); if( theThing ) { theThing.doSomething(); } -- 假设需要先检查再执行的情况。

0