最近,我一直在做很多模态窗口弹出窗口,而我没有使用jQuery。我用来在页面上创建新元素的方法绝大多数遵循以下原则:
$("<div></div>");
但是,我感到这不是执行此操作的最佳或最有效的方法。从性能的角度来看,在jQuery中创建元素的最佳方法是什么?
该答案具有以下建议的基准。
最近,我一直在做很多模态窗口弹出窗口,而我没有使用jQuery。我用来在页面上创建新元素的方法绝大多数遵循以下原则:
$("<div></div>");
但是,我感到这不是执行此操作的最佳或最有效的方法。从性能的角度来看,在jQuery中创建元素的最佳方法是什么?
该答案具有以下建议的基准。
Answers:
我使用$(document.createElement('div'));
基准测试表明该技术是最快的。我推测这是因为jQuery不必将其标识为元素并创建元素本身。
您应该真正使用不同的Javascript引擎运行基准测试,并用结果权衡受众。从那里做出决定。
appendTo
...,因为注释显然是错误的,因此我将其删除。
我个人建议(出于可读性):
$('<div>');
到目前为止,有关建议的一些数字(Safari 3.2.1 / mac os x):
var it = 50000;
var start = new Date().getTime();
for (i = 0; i < it; ++i) {
// test creation of an element
// see below statements
}
var end = new Date().getTime();
alert( end - start );
var e = $( document.createElement('div') ); // ~300ms
var e = $('<div>'); // ~3100ms
var e = $('<div></div>'); // ~3200ms
var e = $('<div/>'); // ~3500ms
使用jQuery创建HTML元素的最有效方法是什么?
既然如此,jQuery
我认为最好使用这种(干净的)方法(您正在使用)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
这样,您甚至可以对特定元素使用事件处理程序,例如
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'style':'cursor:pointer;font-weight:bold;',
'html':'<span>For HTML</span>',
'click':function(){ alert(this.id) },
'mouseenter':function(){ $(this).css('color', 'red'); },
'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');
但是,当您处理大量动态元素时,应避免handlers
在特定元素中添加事件,而应使用委托事件处理程序,例如
$(document).on('click', '.myClass', function(){
alert(this.innerHTML);
});
var i=1;
for(;i<=200;i++){
$('<div/>', {
'class':'myClass',
'html':'<span>Element'+i+'</span>'
}).appendTo('body');
}
因此,如果您创建并追加具有相同类(即(myClass
))的数百个元素,则将更少的内存用于事件处理,因为只有一个处理程序可以为所有动态插入的元素完成这项工作。
更新:由于我们可以使用以下方法来创建动态元素
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
但size
属性不能使用使用这种方法进行设置jQuery-1.8.0
或更高版本,这里是一个老的bug报告,看看这个例子中使用jQuery-1.7.2
这表明size
属性被设置为30
使用上面的例子,但使用相同的方法,我们不能设置size
使用属性jQuery-1.8.3
,在这里是一个不工作的小提琴。因此,要设置size
属性,我们可以使用以下方法
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
还是这个
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
我们可以通过attr/prop
为子对象,但它的工作原理jQuery-1.8.0 and later
版本检查这个例子,但它是行不通的jQuery-1.7.2 or earlier
(在所有早期版本未测试)。
BTW,取自jQuery
错误报告
有几种解决方案。第一个是根本不使用它,因为它不会节省您任何空间,并且可以提高代码的清晰度:
他们建议使用以下方法(也适用于较早的方法,已在中进行测试1.6.4
)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
因此,最好使用这种方法,IMO。此更新是在我阅读/找到此答案后进行的,并且在此答案中显示,如果您使用'Size'(capital S)
而不是,'size'
它将正常工作,即使在version-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
另请阅读有关prop的信息,因为存在差异,Attributes vs. Properties
不同版本的差异也有所不同。
$('<div>', {...})
正在传递包含所有属性的对象,并$('<div>').attr({...})
正在创建不包含任何属性的元素,但attr()
稍后使用方法设置属性。
jQuery.com
网站可能会对@RafaelRuizTabares有所帮助,或者对它进行谷歌搜索:-)
从CPU的角度来看,您不需要从原始操作中获得很少性能的原始性能。
jQuery(html :: String)
方法非常好。除非情况极为不同寻常,否则将不太可能获得更好的感知性能。将优化精力花在可以使用的案例上。此外,jQuery在许多方面都针对速度进行了优化。用它来做理智的事情,并信任但很快地验证它。
您必须了解,元素创建性能的重要性与首先使用jQuery无关。
请记住,创建元素没有真正的目的,除非您实际要使用它。
您可能很想对诸如$(document.createElement('div'))
vs.之类的产品进行性能测试,$('<div>')
并从使用中获得巨大的性能提升,$(document.createElement('div'))
但这只是DOM中尚不存在的一个元素。
但是,最终还是要使用该元素,因此实际测试应包括f.ex。.appendTo();
让我们看看,如果您对以下各项进行相互测试:
var e = $(document.createElement('div')).appendTo('#target');
var e = $('<div>').appendTo('#target');
var e = $('<div></div>').appendTo('#target');
var e = $('<div/>').appendTo('#target');
您会注意到结果会有所不同。有时,一种方法比另一种方法更好。这仅仅是因为计算机上的后台任务数量会随着时间而变化。
因此,最终,您确实想选择一种最小且最易读的创建元素的方式。这样,至少,您的脚本文件将最小。与在DOM中使用元素之前创建元素的方式相比,性能点上的影响可能更大。
document.getElementById('target).appendChild(document.createElement('div'));
有人已经做了一个基准测试: jQuery document.createElement是否等效?
$(document.createElement('div'))
是最大的赢家。
我正在使用jquery.min v2.0.3。对我来说,最好使用以下命令:
var select = jQuery("#selecter");
jQuery("`<option/>`",{value: someValue, text: someText}).appendTo(select);
如下:
var select = jQuery("#selecter");
jQuery(document.createElement('option')).prop({value: someValue, text: someText}).appendTo(select);
第一个代码的处理时间比第二个代码要短得多。