jQuery.parseHTML() 函数详解
定义和用法
$.parseHTML()函数用于将HTML字符串解析为对应的DOM节点数组。
注意:
1.该函数将使用原生的DOM元素创建函数把HTML字符串转换为一个DOM元素的集合,你可以将这些DOM元素插入到文档中。
2.如果没有指定context参数,或该参数为null或undefined,则默认为当前document。如果创建的DOM元素用于另一个文档,例如iframe,则应该指定该iframe的document对象。
安全考虑:大多数jQueryAPI都允许HTML字符串在HTML中包含运行脚本。jQuery.parseHTML()不会运行解析的HTML中的脚本,除非你明确将参数keepScripts指定为true。不过,大多数环境仍然可以间接地执行脚本,例如:通过属性。调用者应该避免这样做,并清理或转义诸如URL、cookie等来源的任何不受信任的输入,从而预防出现这种情况。出于未来的兼容性考虑,当参数keepScripts被省略或为false时,调用者应该不依赖任何运行脚本内容的能力。
语法
$.parseHTML(htmlString[,context][,keepScripts])
参数 | 描述 |
---|---|
htmlString | String类型需要解析并转为DOM节点数组的HTML字符串 |
context | Element类型指定在哪个Document中创建元素,默认为当前文档的document |
keepScripts | Boolean类型指定传入的HTML字符串中是否包含脚本,默认为false |
实例
使用一个HTML字符串创建一个数组的Dom节点,并将它插入一个div
<divid="log"> <h3>Content:</h3> </div> <script> $(function(){ var$log=$("#log"), str="hello,<b>mynameis</b>jQuery.", html=$.parseHTML(str), nodeNames=[]; //添加已解析的HTML $log.append(html); //集合已解析HTML的节点名称 $.each(html,function(i,el){ nodeNames[i]="<li>"+el.nodeName+"</li>"; }); //插入节点名 $log.append("<h3>NodeNames:</h3>"); $("<ol></ol>") .append(nodeNames.join("")) .appendTo($log); }) </script>
示例&说明
以下是与jQuery.parseHTML()函数相关的jQuery示例代码,以演示jQuery.parseHTML()函数的具体用法:
//"<\/script>"必须通过\将/转义,否则JS会认为已经到了脚本结束的位置 varhtml='Hello,<b>CodePlayer</b><scripttype="text/javascript">alert("执行脚本代码");<\/script>'; vardoms=$.parseHTML(html); //不会执行脚本代码 $("#n1").append(doms); alert("分割线"); doms=$.parseHTML(html,true); //会执行脚本代码 $("#n1").append(doms);
返回值
jQuery.parseHTML()函数的返回值为Array类型,返回解析指定HTML字符串后的DOM节点数组。
jQuery.parseHTML使用原生方法将字符串转换为一个DOM节点的集合,然后可以插入到文档。这些方法渲染所有尾随或前导文本(即使只是空格)。为了防止尾随/前导空格被转换为文本节点,你可以通过将HTML字符串传递给jQuery.trim。
默认情况下,如果没有指定或给定null或undefined,context是当前的document。如果HTML被用在另一个document中,比如一个iframe,该frame的文件可以使用。
在3.0中,这种默认行为已经被改变。如果没有指定context,或者给定值为null或undefined,那么将使用一个新的document。这有可能会提高安全性,因为当HTML解析时,内嵌的事件将不会执行。一旦解析的HTML注入到文档中它会执行,但是这给工具一个机会,遍历创建DOM和删除任何东西被视为不安全。这种改进并不适用于jQuery.parseHTML的内部使用,因为他们通常传递给当前文档。因此,如类似$("#log").append($(htmlString))的声明,仍然受制于恶意代码注入。
SecurityConsiderations(安全注意事项)
大多数的jQuery的API接受的HTML字符串将运行所包含在HTML中的脚本。jQuery.parseHTML不运行HTML中解析出来的脚本,除非keepScripts参数为true。然而,它仍然是可能在大多数环境中间接地执行脚本,例如通过<imgonerror>属性。调用者应该意识到这一点,并通过清理或避免任何不可信来源的输入,如URL或cookies,来防止它。为了未来的兼容性,当keepScripts为不确定的或false时,调用者不应该依赖于这个能力来运行任何脚本内容。