Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Google闭包编译器编译jQuery会产生未捕获的TypeError_Javascript_Jquery_Google Closure Compiler - Fatal编程技术网

Javascript 使用Google闭包编译器编译jQuery会产生未捕获的TypeError

Javascript 使用Google闭包编译器编译jQuery会产生未捕获的TypeError,javascript,jquery,google-closure-compiler,Javascript,Jquery,Google Closure Compiler,我想使用Google闭包编译器编译jQuery 2.0.0。当我使用extern时,它声明jquery1.9-1.11和2.0-2.1的extern 我得到以下错误:未捕获类型错误:无法读取未定义的属性“source”。标记以下已编译代码: d.each(d.i.match.ja.source.match(/\w+/g), function(a, b) { var c = ra[b] || d.find.attr; ra[b] = function(a, b, d) { var

我想使用Google闭包编译器编译
jQuery 2.0.0
。当我使用extern时,它声明jquery1.9-1.11和2.0-2.1的
extern

我得到以下错误:
未捕获类型错误:无法读取未定义的属性“source”
。标记以下已编译代码:

d.each(d.i.match.ja.source.match(/\w+/g), function(a, b) {
  var c = ra[b] || d.find.attr;
  ra[b] = function(a, b, d) {
    var h, k;
    d || (k = ra[b],
      ra[b] = h,
      h = null != c(a, b, d) ? b.toLowerCase() : null,
      ra[b] =
      k);
    return h
  }
});
jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(i, name) {
  var getter = jQuery.expr.attrHandle[name] || jQuery.find.attr;

  jQuery.expr.attrHandle[name] = getSetInput && getSetAttribute || !ruseDefault.test(name) ?
    function(elem, name, isXML) {
      var fn = jQuery.expr.attrHandle[name],
        ret = isXML ?
        undefined :
        /* jshint eqeqeq: false */
        (jQuery.expr.attrHandle[name] = undefined) !=
        getter(elem, name, isXML) ?

        name.toLowerCase() :
        null;
      jQuery.expr.attrHandle[name] = fn;
      return ret;
    } :
    function(elem, name, isXML) {
      return isXML ?
        undefined :
        elem[jQuery.camelCase("default-" + name)] ?
        name.toLowerCase() :
        null;
    };
});
该代码对应于此处的非编译代码:

d.each(d.i.match.ja.source.match(/\w+/g), function(a, b) {
  var c = ra[b] || d.find.attr;
  ra[b] = function(a, b, d) {
    var h, k;
    d || (k = ra[b],
      ra[b] = h,
      h = null != c(a, b, d) ? b.toLowerCase() : null,
      ra[b] =
      k);
    return h
  }
});
jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(i, name) {
  var getter = jQuery.expr.attrHandle[name] || jQuery.find.attr;

  jQuery.expr.attrHandle[name] = getSetInput && getSetAttribute || !ruseDefault.test(name) ?
    function(elem, name, isXML) {
      var fn = jQuery.expr.attrHandle[name],
        ret = isXML ?
        undefined :
        /* jshint eqeqeq: false */
        (jQuery.expr.attrHandle[name] = undefined) !=
        getter(elem, name, isXML) ?

        name.toLowerCase() :
        null;
      jQuery.expr.attrHandle[name] = fn;
      return ret;
    } :
    function(elem, name, isXML) {
      return isXML ?
        undefined :
        elem[jQuery.camelCase("default-" + name)] ?
        name.toLowerCase() :
        null;
    };
});
下面是我在联机闭包编译器中输入的内容:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @code_url https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.js
// @externs_url https://raw.githubusercontent.com/google/closure-compiler/master/contrib/externs/jquery-1.9.js
// ==/ClosureCompiler==
// ADD YOUR CODE HERE

$("#foo").html("Example Text");

我想知道是否有人知道如何修复extern,以便它能够与jQuery的更高版本一起工作,或者是否有一个extern可用于更高版本?

您使用的extern没有在任何地方定义
expr
。(我没有找到
jQuery.expr
的在线文档,您确定这是jQuery的一部分吗?)

我建议在代码开头添加一些“健全检查”,如下所示:

goog.require('goog.asserts');
goog.asserts.assert(goog.isFunction(jQuery.each));
goog.asserts.assert(goog.isObject(jQuery.expr));
goog.asserts.assert(goog.isObject(jQuery.expr.match));
goog.asserts.assert(goog.isObject(jQuery.expr.match.bool));
goog.asserts.assert(goog.isObject(jQuery.expr.match.bool.source));
goog.asserts.assert(goog.isFunction(jQuery.expr.match.bool.source.match));
这将有助于显示外部程序是否正在使用闭包编译器

对于调试,也可以使用简单编译,或者更好地使用未编译运行


外部可能不完整,您可以自己复制并编辑它。但是我认为您需要重新构建编译器(我相信externs将成为compiler.jar文件的一部分)。

可能的externs副本用于外部代码-询问者正在编译jQuery的源代码。jQuery源代码与编译器的高级优化模式不兼容。好的,这解释了为什么我没有找到
jQuery.expr
。同意,jQuery源代码不会使用闭包编译器编译。我相信您可以将jQuery作为未编译的外部代码,与使用闭包编译器编译的自己的代码一起使用(可能不是OP想要的)。