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