使用 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]));
- 我在闭包中将
text()
输出转换为字符串;
- 我使用了
new_calendar
的第0个元素,而不是直接new_calendar
。
- 我将
html()
更改为 empty().append()
因为 append()
函数接受一个 jQuery
对象作为输入
这让闭包编译器很高兴。
是的,这绝对是预期的行为。在 JavaScript 中有很多 "work" 的东西。 Closure-compiler 试图在被问到时强制表现良好。
至于 jQuery - 这些是已发布 jQuery API 的 正常 限制。使用 jQuery 代码通常支持未记录的行为(就像您列出的那样)。但是,jQuery 团队可以随时更改未记录在案的行为。
Closure-compiler 如果您与 API 规范中列出的内容不匹配(并且 that definition 由社区维护 - 因此并不总是 100% 正确),则会警告您。
相关规格如下:
- jQuery().html(string) - 一串HTML设置为每个匹配元素的内容
- jQuery.parseHTML('string') - Returns: 数组
我使用 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);
我有一组简单的实际有效的语句(我有 运行 那个代码,它做了我期望的),看起来如下:
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]));
- 我在闭包中将
text()
输出转换为字符串; - 我使用了
new_calendar
的第0个元素,而不是直接new_calendar
。 - 我将
html()
更改为empty().append()
因为append()
函数接受一个jQuery
对象作为输入
这让闭包编译器很高兴。
是的,这绝对是预期的行为。在 JavaScript 中有很多 "work" 的东西。 Closure-compiler 试图在被问到时强制表现良好。
至于 jQuery - 这些是已发布 jQuery API 的 正常 限制。使用 jQuery 代码通常支持未记录的行为(就像您列出的那样)。但是,jQuery 团队可以随时更改未记录在案的行为。
Closure-compiler 如果您与 API 规范中列出的内容不匹配(并且 that definition 由社区维护 - 因此并不总是 100% 正确),则会警告您。
相关规格如下:
- jQuery().html(string) - 一串HTML设置为每个匹配元素的内容
- jQuery.parseHTML('string') - Returns: 数组
我使用 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);