最近我一直在做很多模态窗口弹出窗口,什么不是,我使用jQuery.我用来在页面上创建新元素的方法绝大多数都是这样的:
$("");
但是,我觉得这不是最好或最有效的方法.从性能角度来看,在jQuery中创建元素的最佳方法是什么?
这个答案有以下建议的基准.
我使用$(document.createElement('div'));
Benchmarking显示这种技术是最快的.我推测这是因为jQuery不必将其识别为元素并创建元素本身.
您应该使用不同的Javascript引擎运行基准测试,并根据结果权衡您的受众.从那里做出决定.
我亲自建议(为了便于阅读):
$('');目前为止建议的一些数字(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格式.例如,要创建跨度,请使用$("")或$(" span>"),而不是使用结束斜杠/标记.
@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,取自
jQuery
bug报告有几种解决方案.第一种是根本不使用它,因为它不会为您节省任何空间,这提高了代码的清晰度:
他们建议使用以下方法(也适用于早期的方法,经过测试
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调用完成所有这些操作.
推荐阅读
如何解决《如何查找时钟的秒针是在更大的区域还是更小的区域》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Qt和OpenGLWindow-调整大小的闪烁》经验,为你挑选了0个好方法。 ... [详细] 如何解决《vscode中的tasks.json文件在哪里?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《AVAudioEngine.start()崩溃,即使它包含在do/catch中》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何解决这个"索引0超出空数组的界限!"》经验,为你挑选了1个好方法。 ... [详细] 如何解决《IntelliJ中的调试gradle任务》经验,为你挑选了0个好方法。 ... [详细] 如何解决《正确处理PHP7返回类型的方法》经验,为你挑选了3个好方法。 ... [详细] 如何解决《选择一个选项时,显示组合框值而不是文本》经验,为你挑选了1个好方法。 ... [详细] 如何解决《414URI太长了.但不总是》经验,为你挑选了0个好方法。 ... [详细] 如何解决《在MicrosoftSQLServer中使用复合键》经验,为你挑选了0个好方法。 ... [详细] 如何解决《适用于iOS9+的Objective-CiOS日历视图》经验,为你挑选了1个好方法。 ... [详细] 如何解决《得到奇怪的'未定义方法'错误》经验,为你挑选了1个好方法。 ... [详细] 如何解决《jQueryload()不会在div中加载脚本标签》经验,为你挑选了1个好方法。 ... [详细] 如何解决《使用R到COUNT()和GROUP_CONCAT(DISTINCTx)》经验,为你挑选了2个好方法。 ... [详细] 如何解决《ProgressBar的颜色没有改变c#》经验,为你挑选了1个好方法。 ... [详细] 如何解决《ActiveDirectoryLDAP示例》经验,为你挑选了0个好方法。 ... [详细] 如何解决《方法的擦除与类型中的另一种方法相同》经验,为你挑选了1个好方法。 ... [详细] 如何解决《在派生类中传递*args/**kwargs》经验,为你挑选了1个好方法。 ... [详细] 吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1如何通过Play设置HikariCP池大小
- 2在多行中连接python中的字符串
- 3Aurelia的角度服务?
- 4Android gps提供商和gps图标
- 5在C++中查找两个字符串是否为字谜
- 6计算defaultdict列表中的特定项目
- 7如何使用Swift将屏幕截图分享到Facebook?
- 8禁用特殊的"类"属性处理
- 9如何在Android Studio中正确使用Git?
- 10如何将Eclipse中的ctrl单击功能映射到鼠标中键?
- 11是否会有另一个Common Lisp标准?
- 12动画按钮允许用户交互不起作用
- 13如何使用android gradle resConfigs只打包默认语言
- 14正则表达式匹配难度
- 15在QToolTip中使用图片或图像
- 16如何在openpyxl中使用字段名称或列标题?
- 17numpy抛出异常的逻辑索引
- 18以编程方式在android中创建pdf文件并在其中书写
- 19如何在本地测试Azure Webjobs SDK项目?
- 20在端口3000上运行的Chrome服务工作进程?
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有