最近我一直在做很多模态窗口弹出窗口,什么不是,我使用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调用完成所有这些操作.
推荐阅读
如何解决《Xcode项目中的Jpeg图片报告无效》经验,为你挑选了1个好方法。 ... [详细] 如何解决《lubridatemaskingdplyr"union"但加载时没有掩码消息》经验,为你挑选了0个好方法。 ... [详细] 如何解决《c++函数指针没有改变》经验,为你挑选了0个好方法。 ... [详细] 如何解决《只需使用Immutable.js将对象分配给变量,即可克隆新对象》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何应对竞争条件》经验,为你挑选了1个好方法。 ... [详细] 如何解决《一个TickObject到底是什么?如何防止它成为内存泄漏?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《3-D笛卡尔指向2-D半球形并计算2-DVoronoi单元的面积》经验,为你挑选了0个好方法。 ... [详细] 如何解决《对象初始值设定项中的属性赋值与C#6中的自动属性不在同一级别上》经验,为你挑选了1个好方法。 ... [详细] 如何解决《'List<T>'可能不包含'Object'类型的类型对象》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Sequelize-如何搜索多个列?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《错误的CSS风格》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何从Windows窗体创建.exe文件》经验,为你挑选了1个好方法。 ... [详细] 如何解决《获取pandas数据帧中所有唯一行的计数》经验,为你挑选了1个好方法。 ... [详细] 如何解决《文件扩展的正则表达式》经验,为你挑选了0个好方法。 ... [详细] 如何解决《有没有办法在PIL中指定矩形的宽度?》经验,为你挑选了2个好方法。 ... [详细] 如何解决《什么是MVC6中@Scripts.Render的替代品》经验,为你挑选了1个好方法。 ... [详细] 如何解决《虚拟继承的价格是多少?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《CSS转换旋转仅在div向左浮动时才起作用》经验,为你挑选了1个好方法。 ... [详细] 如何解决《使用UIAppearance更改所有UITableViewCell的文本颜色》经验,为你挑选了0个好方法。 ... [详细] 如何解决《根据JavaScript中的长度将字符串转换为一系列下划线》经验,为你挑选了1个好方法。 ... [详细]吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1使用本地帐户使用安全的ASP Net 5 web api
- 2Symfony Config Treebuilder
- 3c枚举的重要性(typedef enum)
- 4使用Typescript 1.7从Angular 2模块导入类时遇到麻烦
- 5现在将从Swift 3中删除C-Style for循环,这是一种不执行循环的简洁方法?
- 6如何通过Swift Package Manager在Xcode中安装Package
- 7Javascript中的实例与引用vs对象
- 8AWS cli查询以获取具有特定源名称的Cloudfront"域名"
- 9d3美国国家地图与标记,缩放转换问题
- 10表测试多返回值函数
- 11OpenMP vs gcc编译器优化
- 12Xilinx TCL Shell在哪里发出结果?
- 13如何强制查询范围?
- 14在Angular中,您如何确定活动路线?
- 15为什么lambda不会从达到范围捕获类型const double,但const int是?
- 16JavaScript中有"! - "做什么?
- 17通过联系人ID查询发票时,Xero API不返回值
- 18使用许多不同种类的表情符号和语言时,对C ++ JNI NewStringUTF的调用会使android应用程序崩溃(除了ascii,但仍然是有效的修改版utf-8)
- 19在Python数组中使用通配符?
- 20Hexfloat机械手和精度
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有