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

Dealing with jQuery parseHTML() and html() when using 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", new_calendar));

result 来自 AJAX 回复,你应该认得 jqxhr 字段。

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

a = /** @type {string} */ jQuery("data[name='calendar']", result_xml).text();

现在我将该字符串转换为 HTML DOM,认为它是一个元素:

new_calendar = /** @type {Element} */ jQuery.parseHTML(a);

这就是我得到这个奇怪错误的地方:

WARNING - invalid cast - must be a subtype or supertype
from: (Array.<(Element|null)>|null)
to : (Element|null)

所以 parseHTML() 会返回一个元素数组(或 null)?

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

WARNING - invalid cast - must be a subtype or supertype found : (Array.<(Element|null)>|null)
required: (Document|Element|Object.|jQuery|null|undefined)

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

Element 的数组会被认为是 Document 吗?

然后最后(是的!所有这些都是 JavaScript 的 3 行!)关于 html() 函数的输入我得到另一个错误:

WARNING - actual parameter 1 of jQuery.prototype.html does not match formal parameter found : jQuery
required: (function (number, string): ?|string|undefined)
jQuery("div.calendar").html(jQuery("div.calendar table.calendar-table", new_calendar));

这里也是,它在现实世界中有效... jQuery 对象会自动转换为字符串,然后重新转换为要添加到我的日历中的一组标签吗?

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


根据乍得的回答,我这样更改了我的代码:

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]));
  1. 我在闭包中将 text() 输出转换为字符串;
  2. 我使用了new_calendar的第0个元素,而不是直接new_calendar
  3. 我将 html() 更改为 empty().append() 因为 append() 函数接受一个 jQuery 对象作为输入

这让闭包编译器很高兴。

是的,这绝对是预期的行为。在 JavaScript 中有很多 "work" 的东西。 Closure-compiler 试图在被问到时强制表现良好。

至于 jQuery - 这些是已发布 jQuery API 的 正常 限制。使用 jQuery 代码通常支持未记录的行为(就像您列出的那样)。但是,jQuery 团队可以随时更改未记录在案的行为。

Closure-compiler 如果您与 API 规范中列出的内容不匹配(并且 that definition 由社区维护 - 因此并不总是 100% 正确),则会警告您。

相关规格如下:

我使用 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);