Javascript 使用Google闭包编译器时处理jQuery parseHTML()和html(),,,

Javascript 使用Google闭包编译器时处理jQuery parseHTML()和html(),,,,javascript,jquery,casting,google-closure-compiler,Javascript,Jquery,Casting,Google Closure Compiler,我有一组简单的语句可以实际工作(我已经运行了该代码,它实现了我所期望的功能),如下所示: result_xml = result.jqxhr.responseXML; a = jQuery("data[name='calendar']", result_xml).text(); new_calendar = jQuery.parseHTML(a); jQuery("div.calendar").html(jQuery("div.calendar table.calendar-table", ne

我有一组简单的语句可以实际工作(我已经运行了该代码,它实现了我所期望的功能),如下所示:

result_xml = result.jqxhr.responseXML;
a = jQuery("data[name='calendar']", result_xml).text();
new_calendar = jQuery.parseHTML(a);
jQuery("div.calendar").html(jQuery("div.calendar table.calendar-table", new_calendar));
result
来自AJAX回复,您应该识别
jqxhr
字段

我希望
a
是一个字符串,因为我使用
text()
获得一块数据。数据是我保存在XML文档中的HTML字符串。所以我可以这样说:

a = /** @type {string} */ jQuery("data[name='calendar']", result_xml).text();
result_xml = result.jqxhr.responseXML;
a = /** @type {string} */ (jQuery("data[name='calendar']", result_xml).text());
new_calendar = jQuery.parseHTML(a);
jQuery("div.calendar").empty().append(jQuery("div.calendar table.calendar-table", new_calendar[0]));
现在,我将该字符串转换为HTML DOM,并认为它将是一个元素:

new_calendar = /** @type {Element} */ jQuery.parseHTML(a);
这就是我得到这个奇怪错误的原因:

警告-无效强制转换-必须是子类型或超类型
from:(数组。| null)
收件人:(元素|空)

那么
parseHTML()
将返回一个元素数组(或null)

然后我尝试在
html()
函数中使用
parseHTML()
的输出,在那里,我也很难理解发生了什么

警告-无效强制转换-必须是子类型或超类型 找到:(数组。| null)
必需:(文档|元素|对象.| jQuery | null |未定义)

坦率地说,我不明白为什么谷歌编译器会使一个函数的输出不能成为另一个函数的输入,即使它在现实世界中工作得很好

元素的数组
会被视为
文档

最后(是的!三行JavaScript都是这样!)我在输入
html()
函数时遇到了另一个错误:

警告-jQuery.prototype.html的实际参数1与形式参数不匹配 找到:jQuery
必需:(函数(数字、字符串):?|字符串|未定义)
jQuery(“div.calendar”).html(jQuery(“div.calendar table.calendar table”,new_calendar))

在这里,它也在现实世界中起作用。。。jQuery对象是否会自动转换为字符串,然后重新转换为要添加到日历中的一组标记

所有这些都是闭包编译器的正常限制吗


根据Chad的回答,我将代码更改为:

a = /** @type {string} */ jQuery("data[name='calendar']", result_xml).text();
result_xml = result.jqxhr.responseXML;
a = /** @type {string} */ (jQuery("data[name='calendar']", result_xml).text());
new_calendar = jQuery.parseHTML(a);
jQuery("div.calendar").empty().append(jQuery("div.calendar table.calendar-table", new_calendar[0]));
  • 我将
    text()
    输出转换为闭包中的字符串
  • 我使用
    new\u calendar
    的元素0,而不是直接使用
    new\u calendar
  • 我用
    empty().append()
    更改了
    html()
    ,因为
    append()
    函数接受
    jQuery
    对象作为输入

  • 这使闭包编译器感到高兴。

    是的,这绝对是预期的行为。JavaScript中有很多东西是“有效”的。闭包编译器试图在被询问时强制执行良好的行为

    至于jQuery——这些是发布的jQueryAPI的正常限制。使用jQuery,代码通常支持未记录的行为(如清单所示)。但是,jQuery团队可以随时更改未记录的行为

    闭包编译器会警告您,如果您与API规范中列出的内容不匹配(并且是由社区维护的,因此并非总是100%正确)

    以下是相关规范:

    • -设置为每个匹配元素内容的HTML字符串
    • -返回:数组

    我使用DOM API而不是jQuery。 数据中有完整的HTML文本

    // create DOM parser object
    var dom_parser = new DOMParser();
    // parse HTML into DOM document object
    var doc = dom_parser.parseFromString(data , "text/html");
    // doc.body.innerHTML = body part in text, not object
    // <body> tag is stripped.
    // append the body part into div with the id "contentsarea".
    $("#contentsarea").empty().append(doc.body.innerHTML);
    
    //创建DOM解析器对象
    var dom_parser=new DOMParser();
    //将HTML解析为DOM文档对象
    var doc=dom_parser.parseFromString(数据,“text/html”);
    //doc.body.innerHTML=文本中的主体部分,而不是对象
    //标签被剥去了。
    //将主体部分附加到id为“contentsarea”的div中。
    $(“#contentsarea”).empty().append(doc.body.innerHTML);