我正在研究别人的jquery脚本,我注意到他正在打开一个标签而没有关闭它,但它似乎也不关心浏览器(尚未用IE测试)
写道:
$('#mydiv').append('<ul>')
但是没有任何地方
.append('</ul>')
脚本不会关闭列表,但浏览器会自动执行此操作(我只是在浏览器中执行了'inspect element')。
这是一种'合法'行为,还是应该始终关闭javascript自动生成内容中的标记?
答案 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>'))