jQuery .val() 和 Google Closure Compiler

3

我想选择控件中的第一个选项,因此我编写了以下代码:

$("#MySelect").val($("#MySelect option:first").val());

现在,请将以下内容复制并粘贴到Google Closure Compiler中:
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/jquery-1.7.js
// ==/ClosureCompiler==

$("#MySelect").val($("#MySelect option:first").val());

你会得到这个错误:

enter image description here

我不明白编译器为什么在抱怨!问题在哪里?
感谢您的建议。

1
你可以这样做 $("#MySelect").prop("selectedIndex", 0 )​​​​ - Esailija
1
看起来内部的.val()方法可能会返回一个与外部.val()方法期望的参数类型不匹配的类型。例如,如果它返回了一个jQuery对象,那就是不正确的 - 当然,我们知道.val()只有在使用参数调用时才会返回一个jQuery对象,所以在您的代码中,内部的.val()永远不会发生这种情况... - nnnnnn
你可以使用index()而不是val() - wirey00
1
@Esailija:你应该将你的评论标记为答案;它有效。 - frenchie
1
我认为这并不是一个真正的答案。这只是一个解决方法 - 但你不应该改变完全正常的代码来让某个工具满意。 - ThiefMaster
2个回答

1
许多jQuery方法根据输入参数的数量和类型返回不同的类型。这种行为类似于传统语言中的函数重载。然而,JavaScript不支持传统的函数重载,而jQuery通过检查函数参数来模拟这种行为。
对于.val,如果支持函数重载,该方法将被注释如下:
/** @return {number|string|Array.<string>} */
jQuery.prototype.val = function() {};

/**
 * @param {number|string|Array.<string>|function(number, *)} newVal
 * @return {!jQuery}
 */
jQuery.prototype.val = function(newVal) {};

由于没有函数重载,.val 的实际签名是两种用法的组合:

/**
 * @param {(number|string|Array.<string>|function(number, *))=} newVal
 * @return {!jQuery|number|string|Array.<string>|function(number, *)}
 */
jQuery.prototype.val = function(newVal) {};

因此,如果您希望将 .val 的返回值用作调用另一个.val 的输入,则必须对原始返回值进行类型转换以指定您期望的用法:
$("#MySelect").val(
    /** @type {number|string|Array.<string>} */
    ($("#MySelect option:first").val()) //note the extra parens
);

这种行为在jQuery externs文件的顶部有一条注释进行了描述:http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.7.js#20

1
你可以使用 $("#MySelect").prop("selectedIndex", 0)​​​​ 来实现。这样更简单,而且可以通过闭包编译器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接