jQuery:没有在构造函数中关闭标记的风险

时间:2011-05-09 20:06:16

标签: jquery html html-parsing

我有理由使用$('<div></div>')代替$('<div>')吗?

$('<div><b></b></div>')代替$('<div><b>')

我喜欢后者,因为它更短。

4 个答案:

答案 0 :(得分:5)

jQuery会自动为你关闭标签,不需要自己关闭它。

$('<div>')是一件非常好的事情

然而,在第二件事中你要追加<b>我会这样做:

$('<div>',{html: $('<b>')}); // or $('<div>').append($('<b>')) 

小提琴:http://jsfiddle.net/maniator/m9wbb/

答案 1 :(得分:3)

我在IE中发现了使用$("<div></div>")而不是$("<div>")来修复我的代码的边缘情况。我总是以偏执狂的方式做到这一点。

我确信jQuery文档在某些时候明确表示你应该关闭所有标签。 1.6不再是这种情况,但如果您使用的是1.3.2或1.4.2,则可能需要关闭它们才能安全。

虽然如果你看一下源代码,我会觉得对于简单的标签来说它是完全安全的。请注意,对于具有属性的复杂标记或标记,源使用.innerHTML,因此我强烈建议您传入正确关闭的标记。

来源

var rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;

...

// If a single string is passed in and it's a single tag
// just do a createElement and skip the rest
ret = rsingleTag.exec(selector);

if (ret) {
    if (jQuery.isPlainObject(context)) {
        selector = [document.createElement(ret[1])];
        jQuery.fn.attr.call(selector, context, true);

    } else {
        selector = [doc.createElement(ret[1])];
    }

} else {
    ret = jQuery.buildFragment([match[1]], [doc]);
    selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
}   

$("<div>")的情况下,您会发现ret[1]是“div”,因此它会调用document.createElement("div")

答案 2 :(得分:2)

这取决于您是使用单个标签还是多个标签来创建元素/元素。

如果您使用单个标记,jQuery将使用document.createElement方法创建元素,因此使用"<div/>""<div></div>"无关紧要。

如果您有多个元素,jQuery将通过创建div元素并将HTML代码放在innerHTML属性中来创建元素。要使浏览器正确解析HTML代码,您必须根据您使用的HTML版本编写它。如果您正在为页面使用XHTML,那么用于创建元素的HTML代码也必须是XHTML。

答案 3 :(得分:0)

jQuery为您做到了这一点,但考虑编写正确的HTML以获得更好的可读性(问题中的前者):)