我必须用jquery.append()指定endding标签吗?

时间:2010-11-14 20:55:35

标签: javascript jquery html

我正在研究别人的jquery脚本,我注意到他正在打开一个标签而没有关闭它,但它似乎也不关心浏览器(尚未用IE测试)

写道:

$('#mydiv').append('<ul>')

但是没有任何地方

.append('</ul>')

脚本不会关闭列表,但浏览器会自动执行此操作(我只是在浏览器中执行了'inspect element')。

这是一种'合法'行为,还是应该始终关闭javascript自动生成内容中的标记?

2 个答案:

答案 0 :(得分:4)

要正确执行此操作,追加:

$('#mydiv').append('<ul></ul>')

是的浏览器会处理它(特别是.innerHTML实现处理它, jQuery),至少是主要的,但为什么在所有情况下都不安全并使用有效的标记?

$('#mydiv').append('<ul>')

... 仍然仅在调用.innerHTML createElement时调用$('<ul>')而非{{1}}。正如我之前所说,浏览器使用document.createElement()而不是 jQuery和 .append()来处理它(它不会采用这样的语法) 。
document.createElement

答案 1 :(得分:3)

简短回答:你应该。

简短的回答导致简短的回答:

当你说.append('<ul>')时,
甚至.append('<ul></ul'),在幕后jQuery调用document.createElement,浏览器知道该怎么做。

这并不像jQuery实际上将HTML字符串放在任何地方,而是解析它并创建必要的DOM元素

更新 - 正如尼克指出的那样,情况可能并非总是如此。相关来源:init 如果您只是ul传递,则只需调用createElement。如果html字符串更复杂,它将进入buildFragment,这比那更复杂。

基于此,我会说通过jQuery创建单个元素的最佳/最快方法是做类似的事情

$('<ul>').appendTo($target);

更新2- 显然jQuery只在某些方法中调用createElement,但append最终调用clean,其中有一个关闭标记的正则表达式。无论哪种方式,你都是安全的,jQuery会像往常一样保存你。 相关来源:

...

} else if ( typeof elem === "string" ) {
  // Fix "XHTML"-style tags in all browsers
  elem = elem.replace(rxhtmlTag, "<$1></$2>");

  ...

更新3-所以事实证明,当你调用append时,jQuery不会为你修复任何东西,它只是将字符串注入一个临时的div元素。似乎大多数浏览器都知道如何处理HTML,即使没有正确关闭,但要保存它可能最好自己关闭它!或者,如果你感到懒惰,做一些不使用innerHTML的.append($('<ul>'))