【问题标题】:jquery .val() and google closure compilerjquery .val() 和 google 闭包编译器
【发布时间】:2012-08-10 21:06:06
【问题描述】:

我想选择控件中的第一个选项,所以我写:

$("#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());

你会得到这个错误:

我不明白为什么编译器会抱怨!有什么问题?

感谢您的建议。

【问题讨论】:

  • 你可以这样做$("#MySelect").prop("selectedIndex", 0 )​​​​
  • 看起来内部.val() 方法可能返回与外部.val() 方法期望的参数不匹配的类型。例如,如果它返回了一个不正确的 jQuery 对象 - 当然我们知道 .val() 仅在调用 with 参数时返回一个 jQuery 对象,因此在您的代码中永远不会发生在内部.val()...
  • 你可以用index()代替val()
  • @Esailija:您应该将您的评论标记为答案;它有效。
  • 我认为这不是一个真正的答案。这是一种解决方法 - 但您不必为了让某些工具满意而更改完美的代码。

标签: javascript jquery google-closure-compiler


【解决方案1】:

你可以这样做$("#MySelect").prop("selectedIndex", 0)​​​​。它更简单,并且通过闭包编译器。

【讨论】:

    【解决方案2】:

    许多 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多