javascript - createelement用法 - js data方法




jQuery document.createElement是否等同? (9)

我正在重构一些旧的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

但我不确定这是否更好。



开箱即用的jQuery没有相应的createElement。 实际上,大多数jQuery的工作是在内部使用innerHTML完成纯DOM操作。 正如亚当在上面提到的那样,这就是你如何取得类似的结果

还有一些插件可以利用innerHTML上的DOM,比如appendDOMDOMECFlyDOM等等。 性能明智的本地jquery仍然是最高性能的(主要因为它使用innerHTML)


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

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

我这样做:

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

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

例如:

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

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

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


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

有两个好处:

1.如果你使用旧的方式,可能是$(string) ,jQuery将检查字符串以确保你想选择一个html标签或创建一个新的元素。 通过使用$.parseHTML() ,你告诉jQuery你想明确地创建一个新元素,所以性能可能会好一点。

更重要的是,如果你使用旧的方式,你可能会遭受跨站点攻击( 更多信息 )。 如果你有类似的东西:

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

这一切都非常简单! 下面有几个简单的例子...

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

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

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

更新 :我认为我会更新这篇文章,因为它仍然有相当的流量。 在下面的评论中,作为创建新元素的一种方式,讨论了$("<div>") vs $("<div></div>")$(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上,这可能比我原始的基准测试更科学一些,再加上它现在可以被众包!

jsben.ch/#/ARUtz


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




dhtml