如何检测选择器返回null?
如何检测选择器是否返回null?
当选择器返回一个jQuery对象数组时,如果没有找到匹配的元素,它会返回一个空数组。你可以通过检查选择器返回的集合的长度.length
,或者检查第一个数组元素是否为'undefined'来判断。
你可以在IF语句中使用以下任何一个示例,它们都会产生相同的结果。如果选择器找到了匹配的元素,则返回True,否则返回False。
$('#notAnElement').length > 0 $('#notAnElement').get(0) !== undefined $('#notAnElement')[0] !== undefined
我通常使用.length
,除非代码热点。这是最清晰明确的方式。另外,.size()
已经被废弃多年(自1.8版本起)。我将编辑你的答案并删除它,如果需要可以添加一个注释,但它太旧了,我认为最好删除。
从技术上讲,它返回一个不包含DOM节点的jQuery对象。说它返回一个空数组是不正确的。
问题的出现原因:
在上述代码中,通过使用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") }
如何检测选择器是否返回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(); }
-- 假设需要先检查再执行的情况。