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

Dealing with jQuery parseHTML() and html() when using Google closure compiler,,,

本文关键字:html parseHTML jQuery Google 闭包 编译器 处理 使用      更新时间:2023-09-26

我有一组简单的语句,它们实际上可以工作(我已经运行了代码,它做了我期望的事情),如下所示:

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();

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

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

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

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

那么parseHTML()会返回一个元素数组(或null)吗?

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

警告-无效的强制转换-必须是子类型或超类型已找到:(数组。<(元素|null)>|null)
必需:(Document|Element|Object.|jQuery|null|undefined)

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

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

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

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

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

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


根据Chad的回答,我用这种方式更改了代码:

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. 我用empty().append()更改了html(),因为append()函数接受jQuery对象作为输入

这让闭包编译器很高兴。

是当然,这是预期的行为。在JavaScript中有很多"有效"的东西。闭包编译器试图在被要求时强制执行良好的行为。

至于jQuery-这些是发布的jQuery API的常规限制。使用jQuery,代码通常支持未记录的行为(如您所列出的)。然而,jQuery团队可以随时自由更改未记录的行为。

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

以下是相关规范:

  • jQuery().html(string)-要设置为每个匹配元素内容的html字符串
  • jQuery.parseHTML('string')-返回:数组

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