题 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

但我不确定这是否更好。


1136
2017-11-06 12:26


起源


jsben.ch/#/ARUtz  - jquery vs createElement的基准 - EscapeNetscape
可能重复 在jQuery中创建div元素 - T.Todua


答案:


这是你在“一”行中的例子。

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

更新:我想我会更新这篇文章,因为它仍然会有相当多的流量。在下面的评论中有一些讨论 $("<div>") VS $("<div></div>") VS $(document.createElement('div')) 作为一种创造新元素的方式,这是“最好的”。

我把它放在一起 一个小基准,这里大致是重复上述选项100,000次的结果:

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


1200
2017-11-06 12:34



您会发现document.createElement比让jQuery将html字符串转换为元素要快得多。 (以防你有提高效率的冲动) - Sugendran
这对jQuery来说是真实的<1.3它的速度相当于现在我相信。 - Rob Stevenson-Leggett
@Kevin,这是真的,但它让jQuery做更多工作(它通过正则表达式来运行它来添加结束标记),所以我更喜欢上面的方法。此外,它区分您的代码 $('div') 这在视觉上非常相似,但在功能上相互分开。 - nickf
所以基本上是@Sungendran和@nickf的组合 $(document.createElement('div')) 它应该是最快的? - Kolky
我认为“正确”的方式是$('<div />'),IMO具有更多“意义”,因为很明显你正在创建一个Node。糟糕的是这种方式打破了所有编辑器中的语法突出显示=( - Erik Escobedo


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

例如:

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

然后,如果您愿意,可以以编程方式填充此表。

这使您能够指定任何您喜欢的任意HTML,包括类名或其他属性,您可能会发现它们比使用更简洁 createElement 然后设置属性,如 cellSpacing 和 className 通过JS。


123
2017-11-06 12:30



也许这很明显,并且由您的示例指出,但是使用$(“<html string>”)语法创建jQuery DOM元素不能使用本机<element> .appendChild方法或类似方法附加到DOM中。您必须使用jQuery append方法。 - Adam
$(htmlStr) 实现为 document.createElement("div").innerHTML = htmlStr。换句话说,它调用浏览器的HTML解析器。格式错误的HTML在IE中与其他浏览器的区别不同。 - Matthew
@Adam jQuery对象有 get 返回本机DOM元素的函数。 (我知道这个话题很老,但我把它作为参考。;-)) - Randy Marsh
如果您遇到html字符串问题,请尝试解析它 jQuery.parseHTML - fguillen
@Adam或者,如果你的代码流/眼睛更容易,你可以做到 [dom element].appendChild($('<html>')[0]); - ACK_stoverflow


创建新的DOM元素是其中的核心功能 jQuery() 方法,见:


63
2017-07-15 07:14



感谢您链接文档! $('<a>') 不可饶恕! - Colonel Panic


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

有两个好处:

如果你使用旧的方式,可能是这样的 $(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>​]

39
2018-01-24 03:01



+1之间的区别 a 和 b - Kyle Marimon
“更好地选择”以“创造[任何]元素”可能会很强大。 @ siergiej的回答 做得很好 parseHTML 对来自外部来源的HTML有好处,但那“在将结果包装到新的jQuery对象之后,所有的提升都消失了“。也就是说,如果你想硬编码一个新的jQuery包装的html元素的创建, $("<div>stuff</div>") 风格似乎仍然获胜。 - ruffin


我这样做:

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

36
2017-11-24 18:07





我觉得用 document.createElement('div') 和...一起 jQuery 是比较快的:

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

34
2018-06-18 05:53





虽然这是一个非常古老的问题,但我认为用最新信息更新它会很好;

从jQuery 1.8开始就有了 jQuery.parseHTML() 功能,现在是创建元素的首选方式。此外,通过解析HTML也存在一些问题 $('(html code goes here)')官方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 Link

jQuery 1.9.1

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

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


25
2017-09-29 19:01





var mydiv = $('<div />') // also works

11
2017-11-17 17:03





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

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


7
2017-12-22 22:43





这一切都很直接!下面是一些简单的例子......


var $example = $( XMLDocRoot );

var $element = $( $example[0].createElement('tag') );
// Note the [0], which is the root

$element.attr({
id: '1',
hello: 'world'
});

var $example.find('parent > child').append( $element );

5
2018-05-25 17:17