我有一组简单的实际工作语句(我已经运行了代码,它完成了我对它的期望),如下所示:
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);
这就是我得到这个奇怪错误的地方:
警告 - 无效的强制转换 - 必须是以下的子类型或超类型
:(Array.<(Element | null)> | null)
to:(Element | null)
那么parseHTML()
会返回一个元素数组(或null)?
然后我试图使用函数的输出,parseHTML()
在html()
那里,我很难理解发生了什么.
警告 - 无效的强制转换 - 必须是找到的子类型或超类型:(数组.<(元素| null)> | null)
必需:(文档|元素|对象.| jQuery | null | undefined)
坦率地说,我不明白为什么谷歌编译器会使一个函数的输出不能成为另一个函数的输入,即使它在现实世界中运行得很好.
将数组Element
被视为Document
?
最后(是的!所有这3行JavaScript!)我得到另一个关于html()
函数输入的错误:
警告 - jQuery.prototype.html的实际参数1与找到的形式参数不匹配:
需要jQuery :(函数(数字,字符串)
:?|字符串|未定义)jQuery("div.calendar").html(jQuery("div) .calendar table.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]));
我将text()
输出转换为关闭字符串;
我使用元素0 new_calendar
而不是直接new_calendar
.
我更改了html()
with,empty().append()
因为append()
函数接受一个jQuery
对象作为输入
这使得闭包编译器感到高兴.
是的绝对这是预期的行为.在JavaScript中有许多"工作"的东西.关闭编译器在被问到时会尝试强制执行良好行为.
至于jQuery - 这些是已发布的jQuery API 的常规限制.使用jQuery,代码通常支持未记录的行为(就像您列出的那样).但是,jQuery团队可以随时更改未记录的行为.
Closure-compiler会警告您,如果您不匹配列出的API规范(并且该定义是社区维护的 - 所以并非总是100%正确).
这是相关规格:
jQuery().html(string) - 一个HTML字符串,设置为每个匹配元素的内容
jQuery.parseHTML('string') - 返回:Array