jQuery document.createElement 是否等效?

我正在重构一些旧的 JavaScript 代码,并且正在进行很多 DOM 操作。

var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;

var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);

我想知道是否有使用 jQuery 的更好方法。我一直在尝试:

var odv = $.create("div");
$.append(odv);
// And many more

但是我不确定这是否更好。

答案

这是您在 “一个” 行中的示例。

this.$OuterDiv = $('<div></div>')
    .hide()
    .append($('<table></table>')
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

更新 :我以为我会更新这篇文章,因为它仍然吸引了大量的流量。在下面的评论中,对$("<div>") vs $("<div></div>") vs $(document.createElement('div'))进行了一些讨论,作为创建新元素的方式,以及这是 “最好的”。

我汇总了一个小的基准 ,下面是将上述选项重复十万次的大致结果:

jQuery 1.4、1.5、1.6

Chrome 11  Firefox 4   IE9
<div>            440ms      640ms    460ms
<div></div>      420ms      650ms    480ms
createElement    100ms      180ms    300ms

jQuery 1.3

Chrome 11
<div>             770ms
<div></div>      3800ms
createElement     100ms

jQuery 1.2

Chrome 11
<div>            3500ms
<div></div>      3500ms
createElement     100ms

我认为这并不奇怪,但是document.createElement是最快的方法。当然,在开始重构整个代码库之前,请记住,我们在这里谈论的差异(除 jQuery 的旧版本以外,其他所有差异)相当于每千个元素额外多了 3 毫秒。

更新 2

针对 jQuery 1.7.2 进行了更新,并将基准放在 JSBen.ch 上,这可能比我的原始基准要科学得多,而且现在可以众包!

http://jsben.ch/#/ARUtz

只需提供要添加到 jQuery 构造函数$()的元素的 HTML,即可从新建的 HTML 返回 jQuery 对象,适合使用 jQuery 的append()方法append()其添加到 DOM 中。

例如:

var t = $("<table cellspacing='0' class='text'></table>");
$.append(t);

然后,可以根据需要以编程方式填充此表。

这使您能够指定所需的任意 HTML,包括类名或其他属性,这些属性可能比使用createElement然后通过 JS 设置诸如cellSpacingclassName类的属性更为简洁。

创建新的 DOM 元素是jQuery()方法的核心功能,请参阅:

我这样做

$('<div/>',{
    text: 'Div text',
    class: 'className'
}).appendTo('#parentDiv');

jQuery1.8 ,使用$.parseHTML()创建元素是一个更好的选择。

有两个好处:

1. 如果使用旧方法,可能类似于$(string) ,jQuery 将检查该字符串以确保您要选择 html 标签或创建新元素。通过使用$.parseHTML() ,您告诉 jQuery 您想显式创建一个新元素,因此性能可能会好一些。

2. 更重要的是,如果您使用旧方法,则可能会遭受跨站点攻击( 更多信息 )。如果您有类似以下内容:

var userInput = window.prompt("please enter selector");
    $(userInput).hide();

坏人可以输入<script src="xss-attach.js"></script>来逗你。幸运的是, $.parseHTML()为您避免了这种尴尬:

var a = $('<div>')
// a is [<div>​</div>​]
var b = $.parseHTML('<div>')
// b is [<div>​</div>​]
$('<script src="xss-attach.js"></script>')
// jQuery returns [<script src=​"xss-attach.js">​</script>​]
$.parseHTML('<script src="xss-attach.js"></script>')
// jQuery returns []

但是,请注意, a是 jQuery 对象,而b是 html 元素:

a.html('123')
// [<div>​123​</div>​]
b.html('123')
// TypeError: Object [object HTMLDivElement] has no method 'html'
$(b).html('123')
// [<div>​123​</div>​]

更新

从最新版本的 jQuery 开始,以下方法不会分配在第二个 Object 中传递的属性

先前的答案

我觉得与jQuery一起使用document.createElement('div')更快:

$(document.createElement('div'), {
    text: 'Div text',
    'class': 'className'
}).appendTo('#parentDiv');

尽管这是一个非常老的问题,但我认为最好用最新信息进行更新。

从 jQuery 1.8 开始,有一个jQuery.parseHTML()函数现在是创建元素的首选方法。此外,通过$('(html code goes here)')解析 HTML 存在一些问题,例如,官方 jQuery 网站示例在其发行说明之一中提到了以下内容:

轻松的 HTML 解析:$(htmlString)中的标记之前,您可以再次使用前导空格或换行符。我们仍然强烈建议您在解析从外部来源获得的 HTML 时使用 $ .parseHTML(),并且将来可能会进一步更改 HTML 解析。

为了解决实际问题,可以将提供的示例翻译为:

this.$OuterDiv = $($.parseHTML('<div></div>'))
    .hide()
    .append($($.parseHTML('<table></table>'))
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

不幸的是,这不如仅使用$()方便,但是它为您提供了更多控制权,例如,您可以选择排除脚本标签(尽管这样会像onclick一样保留内联脚本):

> $.parseHTML('<div onclick="a"></div><script></script>')
[<div onclick=​"a">​</div>​]

> $.parseHTML('<div onclick="a"></div><script></script>', document, true)
[<div onclick=​"a">​</div>​, <script>​</script>​]

此外,以下是根据新现实调整的最佳答案的基准:

JSbin 链接

jQuery 1.9.1

$.parseHTML:    88ms
  $($.parseHTML): 240ms
  <div></div>:    138ms
  <div>:          143ms
  createElement:  64ms

看起来parseHTML$()更接近createElement ,但是将结果包装在新的 jQuery 对象中之后,所有的提升都消失了

var mydiv = $('<div />') // also works
var div = $('<div/>');
div.append('Hello World!');

是在 jQuery 中创建 DIV 元素的最短 / 最简单的方法。

我为此做了一个小 jQuery 插件: https : //github.com/ern0/jquery.create

它遵循您的语法:

var myDiv = $.create("div");

可以将 DOM 节点 ID 指定为第二个参数:

var secondItem = $.create("div","item2");

严重吗不会。但是此语法比$(“

”)
更好,并且对于这笔钱来说,这是非常好的价值。

我是一个新的 jQuery 用户,从 DOMAssistant 切换,它具有类似的功能: http : //www.domassistant.com/documentation/DOMAssistantContent-module.php

我的插件更简单,我认为通过链接方法添加属性和内容更好:

$("#container").append( $.create("div").addClass("box").html("Hello, world!") );

另外,这是一个简单的 jQuery 插件(第 100 个)的一个很好的例子。