通常在jQuery无法使用其选择器查找匹配元素的情况下,默认值绝不是例外,而是缺少操作。
我的理解是这是通过设计来完成的,以确保缺少元素不会导致错误条件。但是我发现jQuery.val()
没有表现出同样的行为。如果所选元素不存在,jQuery.val()
将返回undefined
而不是空字符串(与我期望的框架的其余部分保持一致)。
那么为什么jQuery.val()
是框架其余部分的例外,以及改变这种行为的最佳方法是什么?
答案 0 :(得分:6)
这里的关键是jQuery方法的可链接性。当选择器没有匹配任何东西时,jQuery方法不会返回undefined
,因为它会破坏链。考虑:
$( '#doesntExist' ).addClass( 'foo' ).fadeIn();
如果没有匹配任何内容的选择器会返回undefined
,那么它会破坏链,因为undefined
没有任何自己的方法。现在,无论是否找到元素,每个方法都会执行(并且不执行任何操作)。
.val()
是不同的,因为它的目的是返回元素的值。它不像许多其他jQuery方法那样完全链接,因为一个方法必须返回一个jQuery对象才能链接。例如,$( '#foo' ).val().addClass( 'bar' )
无效,无论元素#foo
是否存在。
在这种情况下,如果.val()
返回一个空字符串,就不会再与可链式方法一致,因为当找不到该元素时,没有其他方法返回空字符串,并返回undefined不会破坏可链接性,因为该方法首先不会链接。
(顺便说一句,每个返回值的方法都是如此,例如.css()
和.data()
。)
通常,了解元素的值是否为空或元素是否根本不存在更有用,但如果您希望始终返回一个字符串,则可以添加一个方法你自己的:
$.fn.stringVal = function() {
return( this.val() || '' );
};
答案 1 :(得分:2)
如果我使用.val()
来获取项目的值,我希望该项目存在。如果没有,我需要知道。在这种情况下返回undefined
似乎是最好的方式。
正如@Ricardo所指出的,.val()
在其他情况下的表现也不同,具体取决于输入。
答案 2 :(得分:-2)
jQuery.val()返回输入的值(或“select”的选定选项)