最近我一直在做很多模态窗口弹出框等功能,我使用了jQuery。我用来创建页面上新元素的方法主要是:
$("<div></div>");
然而,我感觉这不是最好或最有效的创建元素的方式。从性能的角度来看,使用jQuery创建元素的最佳方式是什么?
这个答案提供了下面建议的基准测试。
最近我一直在做很多模态窗口弹出框等功能,我使用了jQuery。我用来创建页面上新元素的方法主要是:
$("<div></div>");
然而,我感觉这不是最好或最有效的创建元素的方式。从性能的角度来看,使用jQuery创建元素的最佳方式是什么?
这个答案提供了下面建议的基准测试。
$(document.createElement('div'));
。 基准测试显示,这种技术是最快的。 我猜测这是因为jQuery不必将其识别为元素并自行创建元素。appendTo
,... 因为这些评论显然是错误的,所以我已经将它们删除了。 - tvanfosson个人建议(为了可读性):
$('<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');
但是当你处理大量动态元素时,应该避免在特定元素中添加事件处理程序,而应该使用委托事件处理程序,例如
$(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");
jQuery-1.8.0
或更高版本,无法使用此方法设置 size
属性,并且这里有一个旧的错误报告,请看使用 jQuery-1.7.2
的此示例,它显示使用上述示例将 size
属性设置为 30
,但是使用相同的方法,我们无法使用 jQuery-1.8.3
设置 size
属性,这里是一个不起作用的 fiddle。因此,要设置 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及更高版本
。请参考此示例。但是,在jQuery-1.7.2或更早版本
中(未在所有早期版本中进行测试),这种方法不起作用。
顺便说一下,这来自于jQuery
的错误报告。
有几种解决方案。首先是根本不使用它,因为它并没有节省任何空间,而且这会提高代码的清晰度:
他们建议使用以下方法(在早期版本中也可以使用,已在1.6.4
中进行了测试)。
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
因此,在我看来,最好使用这种方法。在阅读/发现这个答案之后,我进行了更新,并且该答案表明,如果您使用'Size'(大写S)
而不是'size'
,那么它将会正常工作,即使在version-2.0.2
中也是如此。
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
同时阅读有关prop的内容,因为在不同版本中存在差异,属性 vs. 属性
。
$('<div>', {...})
中,您正在传递一个包含所有属性的对象,并且在 $('<div>').attr({...})
中,您正在创建一个没有任何属性的元素,但稍后使用 attr()
方法设置属性。 - The AlphajQuery.com
网站可能会有所帮助,或者使用谷歌进行搜索 :-) - The Alpha实际上,如果你使用 $('<div>')
,jQuery 也会使用 document.createElement()
。
你可以在 第117行 看到这个过程。
虽然存在一些函数调用的开销,但除非性能至关重要(你需要创建数百[千]个元素),否则没有太多理由回到纯粹的 DOM。
对于创建一个新网页中的元素,最好还是坚持使用 jQuery 的方式。
这不是正确的问题答案,但我仍然想分享一下...
如果你想动态创建大量元素并将其附加到DOM上,只需使用document.createElement('div')
而跳过JQuery,可以显著提高性能。
我认为你正在使用最佳方法,不过你可以对其进行优化:
$("<div/>");
从 CPU 的角度来看,你不需要对一个极少执行的操作进行原始性能优化。
jQuery(html :: String)
方法完全没问题。除非情况极其不寻常,否则人们很难获得更好的“感知”性能。将优化精力花在需要优化的情况上。此外,jQuery在许多方面都进行了速度优化。使用它做明智的事情,并相信并验证它的速度快。 - yfeldblum$(document.createElement('div'))
与$('<div>')
的性能差异,并从使用 $(document.createElement('div'))
中获得更好的性能收益,但这只是还没有在DOM中的一个元素。var e = $(document.createElement('div')).appendTo('#target');
var e = $('<div>').appendTo('#target');
var e = $('<div></div>').appendTo('#target');
var e = $('<div/>').appendTo('#target');
document.getElementById('target).appendChild(document.createElement('div'));
- hisdrewness已经有人制定了一个基准: jQuery document.createElement 的等价物?
$(document.createElement('div'))
是最佳选择。