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

Max*_*ich 4 javascript api jquery default-value

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

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

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

JJJ*_*JJJ 6

这里的关键是chainability的jQuery方法.undefined当选择器不匹配时,jQuery方法不会返回,因为它会破坏链.考虑:

$( '#doesntExist' ).addClass( 'foo' ).fadeIn();
Run Code Online (Sandbox Code Playgroud)

如果与任何东西不匹配的选择器将返回undefined它将破坏链,因为undefined它没有自己的任何方法.现在,无论是否找到元素,每个方法都会执行(并且不执行任何操作).

.val()另一方面是不同的,因为它的目的是返回元素的值.它不像许多其他jQuery方法那样链接,因为一个方法必须返回一个jQuery对象才能链接.例如,$( '#foo' ).val().addClass( 'bar' )不能正常工作,无论是否该元素#foo存在与否.

在这种情况下,.val()返回一个空字符串将不再使其与可链接方法一致,因为当找不到该元素时,没有其他方法返回空字符串,并且返回undefined不会破坏可链接性,因为该方法不链条首先.

(顺便说一下,每个返回值的方法都是如此,比如.css().data().)

通常,知道元素的值是否为空或元素是否根本不存在更有用,但如果您希望始终返回一个字符串,则可以添加自己的方法:

$.fn.stringVal = function() {
    return( this.val() || '' );
};
Run Code Online (Sandbox Code Playgroud)