当前位置:  开发笔记 > 编程语言 > 正文

使用jQuery创建HTML元素的最有效方法是什么?

如何解决《使用jQuery创建HTML元素的最有效方法是什么?》经验,为你挑选了11个好方法。

最近我一直在做很多模态窗口弹出窗口,什么不是,我使用jQuery.我用来在页面上创建新元素的方法绝大多数都是这样的:

$("
");

但是,我觉得这不是最好或最有效的方法.从性能角度来看,在jQuery中创建元素的最佳方法是什么?

这个答案有以下建议的基准.



1> strager..:

我使用$(document.createElement('div')); Benchmarking显示这种技术是最快的.我推测这是因为jQuery不必将其识别为元素并创建元素本身.

您应该使用不同的Javascript引擎运行基准测试,并根据结果权衡您的受众.从那里做出决定.


必须像在javascript中一样添加jquery中创建的div.$('
')本身没有附加到DOM,直到你将它追加到某个东西.
此外,使用$(document.createElement('div')); 我认为效率较低,因为如果你只是在这里和那里创建一个元素,那么你需要花费更长的时间才能获得在浏览器中获得的极少量的好处.从技术上讲,由于查询成本和使用它所带来的开销,jQuery本身作为库的效率较低.如果某人有意通过使用document.createElement而不是$('
')来保存千分之一毫秒,那么他们就不应该使用jQuery:],因为$('
')是你使用它的原因之一!
基准测试参考很好,但这也测试了成千上万个元素的创建.在典型情况下,您何时会处理那么多元素?有可能,你需要担心的是比如何创建元素更重要的事情.document.createElement"在0.097秒内运行39,682次",而$('
')"在0.068秒内运行12,642." 我会说如果在不到一秒的时间内可以运行数千次,那么你就是安全的.
jQuery"将它"附加到DOM?哪里?这对我来说没有多大意义 - div会去哪里?
@David - 显然你是对的.我会注意到,当我开始学习jQuery时,我在2年前添加了评论.你需要做一个'appendTo`,...因为评论显然是错误的,我已经将它们删除了.
此外,您保存的毫秒的一小部分可能会在较长代码添加的额外字节数增加的下载时间内丢失很多倍.
@fettereddingoskidney虽然问题的重点是_is_性能,即使不常见,但绝对有需要创建数千个元素的情况,这里注意到的性能差异很大.
@tvanfosson:对不起哥们,你错了.如果你想将`$(document.createElement('div'))`部分添加到DOM中,你必须将它附加或添加到另一个元素(已经在DOM中).实际上,jquery创建的元素没有附加到任何东西(至少在支持documentFragment,AFAIK的现代浏览器中).

2> Owen..:

我亲自建议(为了便于阅读):

$('
');

目前为止建议的一些数字(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 = $('
'); // ~3100ms var e = $('
'); // ~3200ms var e = $('
'); // ~3500ms


从jquery docs:'创建单个元素时,使用结束标记或XHTML格式.例如,要创建跨度,请使用$("")或$(" "),而不是使用结束斜杠/标记.
@Owen,这种行为是一个错误,而不是一个功能.垃圾进入,垃​​圾出 - 只是碰巧你得到的垃圾是可以接受的.但是,不要在jQuery版本之间依赖它,除非函数的规范发生变化.
@tvanfosson这显然发生了变化,在当前的文档中它说:"当参数有一个标签(带有可选的结束标签或快速关闭)时 - $("")或$("" ),$(" ")或$("") - jQuery使用本机JavaScript createElement()函数创建元素."
@MarcStober没有冒犯.它仍然在这里:[http://api.jquery.com/jQuery/#jQuery2](http://api.jquery.com/jQuery/#jQuery2).文档提到_optional结束标记或快速关闭_
正如预期的那样,在Mac OS X Chrome中看到相似的数字(100分钟用于createElement()与500毫秒文本解析)和Mac OS X Firefox(350毫秒对1000毫秒).感谢您编写测试循环.

3> The Alpha..:

题:

使用jQuery创建HTML元素的最有效方法是什么?

回答:

因为jQuery那时我认为最好使用这种(干净的)方法(你正在使用)

$('
', { 'id':'myDiv', 'class':'myClass', 'text':'Text Only', }).on('click', function(){ alert(this.id); // myDiv }).appendTo('body');

DEMO.

这样,您甚至可以为特定元素使用事件处理程序

$('
', { 'id':'myDiv', 'class':'myClass', 'style':'cursor:pointer;font-weight:bold;', 'html':'For HTML', 'click':function(){ alert(this.id) }, 'mouseenter':function(){ $(this).css('color', 'red'); }, 'mouseleave':function(){ $(this).css('color', 'black'); } }).appendTo('body');

DEMO.

但是当你处理大量的动态元素时,你应该避免handlers在特定的元素中添加事件,相反,你应该使用委托的事件处理程序,比如

$(document).on('click', '.myClass', function(){
    alert(this.innerHTML);
});

var i=1;
for(;i<=200;i++){
    $('
', { 'class':'myClass', 'html':'Element'+i+'' }).appendTo('body'); }

DEMO.

因此,如果您创建并附加数百个具有相同类的元素,即(myClass),那么事件处理将消耗更少的内存,因为只有一个处理程序可用于为所有动态插入的元素执行任务.

更新:因为我们可以使用以下方法来创建动态元素

$('', {
    '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属性,我们可以使用以下方法

$('', {
    'type': 'Text',
    'value':'Some Text',
    attr: { size: "30" }
}).appendTo("body");

或者这个

$('', {
    '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,取自jQuerybug报告

有几种解决方案.第一种是根本不使用它,因为它不会为您节省任何空间,这提高了代码的清晰度:

他们建议使用以下方法(也适用于早期的方法,经过测试1.6.4)

$('')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");

所以,最好使用这种方法,IMO.这个更新是在我阅读/找到这个答案之后做出的,在这个答案中表明,如果你使用'Size'(capital S)而不是'size'那么它将会正常工作,即使在version-2.0.2

$('', {
    'type' : 'text',
    'Size' : '50', // size won't work
    'autofocus' : 'true'
}).appendTo('body');

另外阅读关于道具,因为有区别Attributes vs. Properties,它因版本而异.


这是迄今为止最清晰,更易读的方式!可能不是快速的方式,但肯定不会出现错误的字符串添加.谢谢@TheAlpha

4> edwin..:

实际上,如果你正在做$('

'),jQuery也会使用document.createElement().

(只需看看第117行).

有一些函数调用开销,但除非性能是关键的(你创建了数百[数千]元素),没有太多理由恢复到纯DOM.

只是为新网页创建元素可能是一个你最好坚持jQuery做事方式的情况.



5> Collin Allen..:

如果你有很多的HTML内容(不仅仅是一个单一的div以上),你可能会考虑建立HTML到页面中的隐藏的容器内,然后更新它,并在需要的时候使其可见.这样,您的标记的很大一部分可以由浏览器预先解析,并避免在调用时被JavaScript陷入困境.希望这可以帮助!



6> 小智..:

这不是问题的正确答案,但我仍想分享这个......

document.createElement('div')当你想要动态制作大量元素并附加到DOM时,使用Just和skip JQuery将大大提高性能.



7> tvanfosson..:

我认为你正在使用最好的方法,尽管你可以优化它:

 $("
");



8> yfeldblum..:

从CPU的角度来看,您不需要执行极其频繁执行的操作的原始性能.


OP正在创建一个*模态弹出窗口*.此操作不会每秒重复数千次.相反,它最多可能每隔几秒重复一次.使用`jQuery(html :: String)`方法非常好.除非情况极不寻常,否则不太可能实现更好的*感知*性能.在可以使用它的案例上花费优化能量.此外,jQuery还以多种方式针对速度进行了优化.用它来理解,并且相信 - 但是 - 验证它是快速的.

9> Jani Hyytiäi..:

您必须了解元素创建性能的重要性在首先使用jQuery的上下文中是无关紧要的.

请记住,除非你真的要使用它,否则没有创建元素的真正目的.

您可能会尝试使用类似于$(document.createElement('div'))vs的性能测试,$('

')并从使用中获得很好的性能提升,$(document.createElement('div'))但这只是一个尚未在DOM中的元素.

但是,在一天结束时,你仍然想要使用元素,所以真正的测试应该包括f.ex. .appendTo();

让我们看看,如果你互相测试以下内容:

var e = $(document.createElement('div')).appendTo('#target');
var e = $('
').appendTo('#target'); var e = $('
').appendTo('#target'); var e = $('
').appendTo('#target');

您会注意到结果会有所不同.有时一种方式比另一种方式表现更好.这只是因为计算机上的后台任务量随着时间的推移而变化.

在这里测试自己

因此,在一天结束时,您确实希望选择最小且最易读的创建元素的方式.这样,至少,您的脚本文件将尽可能小.对于性能点而言,可能比在DOM中使用它之前创建元素的方式更重要.



10> Erel Segal-H..:

有人已经做了一个基准: jQuery document.createElement等价?

$(document.createElement('div')) 是最大的赢家.



11> 小智..:

有一点是它可能更容易做到:

$("
")

然后使用jquery调用完成所有这些操作.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有