59-讨论
5.14.3 讨论
.html()
方法使用 .innerHTML
属性将HTML内容插入 DOM
, 但是该方法需要一些预处理。在大部分情况下,这不成问题,但是在性能至关重要的代码中,可以直接设置 .innerHTML
属性以节约时间。
实际进行这一处理的是jQuery内部方法.clean()。如果你阅读.clean()的源代码,就会发现它对HTML输入进行了一些清理工作。
注意
找到jQuery源代码中大部分方法的最简方式是搜索方法名称后面加上一个
:
,例如,为了寻找.clean()
方法,可以在无压缩的jQuery源代码中搜索clean:
。
秘诀5.11中的代码与这种清理工作冲突。该秘诀的HTML代码包含大量的 <br/>
标记。 .clean()
中有一个正则表达式,用来查找所有自结束标记(以/>结束,因而不需要结束标记),并检查这些标记是否确实是可以自结束的HTML标记集中的一员。如果不是,则将HTML转换为一个开始-结束标记。
例如,如果编写的代码是 $('#test').html('<div />');
,这个无效的HTML会自动转换为 $('#test').html('<div></div>');
,这种转换使编码更容易,但是如果HTML字符串很长,包含许多自结束标记, .clean()
就必须全部检查——即使所有的标记都是有效的(如其他秘诀中的 <br/>
标记)也不例外。
.html()
方法替换所有现有的内容,并且删除所有被替换元素中通过jQuery附加的事件处理程序,以避免内存泄漏。如果被替换内容中有事件处理程序,你应该坚持使用 .html()
,如果只需要清理事件处理程序,不需要其他HTML清理,可以使用 $('#test').empty() [0].innerHTML = myhtml;
。
基本的标准是:如果你确定代码中不需要jQuery提供的事件清理或者HTML清理,那么你可以小心地直接使用 .innerHTML
。否则为了安全起见,坚持使用 .html()
。