为什么jQuery.val()的行为与jQuery的其余部分不同

时间:2012-07-05 02:02:48

标签: javascript jquery api default-value

通常在jQuery无法使用其选择器查找匹配元素的情况下,默认值绝不是例外,而是缺少操作。

我的理解是这是通过设计来完成的,以确保缺少元素不会导致错误条件。但是我发现jQuery.val()没有表现出同样的行为。如果所选元素不存在,jQuery.val()将返回undefined而不是空字符串(与我期望的框架的其余部分保持一致)。

那么为什么jQuery.val()是框架其余部分的例外,以及改变这种行为的最佳方法是什么?

3 个答案:

答案 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”的选定选项)