欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jQuery.parseHTML() 函数详解

程序员文章站 2023-12-09 16:21:33
定义和用法 $.parsehtml() 函数用于将html字符串解析为对应的dom节点数组。 注意: 1. 该函数将使用原生的dom元素创建函数把html字符串转换为...

定义和用法

$.parsehtml() 函数用于将html字符串解析为对应的dom节点数组。

注意:

1. 该函数将使用原生的dom元素创建函数把html字符串转换为一个dom元素的集合,你可以将这些dom元素插入到文档中。

2. 如果没有指定context参数,或该参数为null或undefined,则默认为当前document。如果创建的dom元素用于另一个文档,例如iframe,则应该指定该iframe的document对象。

安全考虑:大多数jquery api都允许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

<div id="log">
  <h3>content:</h3>
</div>
<script>
$(function () { 
  var $log = $( "#log" ),
    str = "hello, <b>my name is</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>node names:</h3>" );
  $( "<ol></ol>" )
    .append( nodenames.join( "" ) )
    .appendto( $log );
})
</script>

示例&说明

以下是与jquery.parsehtml()函数相关的jquery示例代码,以演示jquery.parsehtml()函数的具体用法:

// "<\/script>"必须通过\将/转义,否则js会认为已经到了脚本结束的位置
var html = 'hello,<b>codeplayer</b><script type="text/javascript">alert("执行脚本代码");<\/script>';


var doms = $.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 ) )的声明,仍然受制于恶意代码注入。

security considerations(安全注意事项)

大多数的jquery的api接受的html字符串将运行所包含在html中的脚本。jquery.parsehtml不运行html中解析出来的脚本,除非 keepscripts参数为true。然而,它仍然是可能在大多数环境中间接地执行脚本,例如通过<img onerror>属性。调用者应该意识到这一点,并通过清理或避免任何不可信来源的输入,如url或cookies,来防止它。为了未来的兼容性,当keepscripts为不确定的或false时,调用者不应该依赖于这个能力来运行任何脚本内容。