jquery - 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'))的讨论,作为创建新元素的一种方法,它是"最佳"。

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

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进行了更新,并将基准放在JSPerf上,这可能比我的原始基准测试更科学,而且它可以是 crowdsourced !

http://jsperf.com/jquery-vs-createelement

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

例如:


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

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

这让你能够指定任何你喜欢的HTML,包括类名或者其他属性,你可能会发现它们比使用 createElement 更简洁,然后将属性设置为 cellSpacingclassName

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

有两个好处:

1.if 使用旧的方式,这可能类似 $(string),jQuery会检查字符串以确定你想要选择一个html标记或者创建一个新元素。 通过使用 $.parseHTML(),你告诉jQuery你想要显式地创建一个新元素,所以性能可能会稍微好一点。

2.much 更重要的事情是,如果你使用旧的方式,你可能会遭受交叉站点攻击。 如果你有类似:


 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>​]

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


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

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

因为 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链接

的jQuery 1.9.1

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

看起来 parseHTML$()createElement 更近,但是所有的促进了包装后的结果在一个新的jquery对象

这一切都很简单 ! 下面是几个快速示例。



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 );

...