JQuery Tips(4) 一些关于提高JQuery性能的Tips


Posted in Javascript onDecember 19, 2009

在选择时,最好以ID选择符作为开头

我想这个很好理解,因为JQuery内部使用document.getElementByID方法进行ID选择,这种方法比其他所有对DOM选择的方法更快,所以以$("#")开头是最好的,比如:

<div id="a"> 
<div class="b"> 
<div class="c"> 
<div class="d"></div> 
</div> 
</div> 
</div> 
<script type="text/javascript"> 
$(".b .c .d")//slow one 
$("#a .b .c .d")//fast one 
</script>

提供$()的上下文
在使用$()选择页面元素时,提供选择的范围可以减少选择的时间,换句话说,让选择器只在页面的一小片范围内筛选而不是整个页面当然会减少筛选时间,通过在$()函数内提供第二个参数作为上下文可以实现这一点
<div id="test"> 
<div class="inner">hi</div> 
</div> 
<script type="text/javascript"> 
alert($(".inner", document.getElementById("test")).text());//increase the speed by provide context 
alert($(".inner").text());//traverse all the element so that is slower than above 
</script>

当然,在jquery定义(或者js函数)事件内,可以通过this来指代上下文:
<div id="test"> 
<div class="inner">hi</div> 
</div> 
<script type="text/javascript"> 
$("#test").click(function() { 
var text = $(".inner", this).text(); //this means $("#test") 
alert(text);//alert hi 
}); 
</script>

当然,上面的例子也可以写成下面两种方式:
<div id="test"> 
<div class="inner">hi</div> 
</div> 
<script type="text/javascript"> 
alert($("#test .inner").text()); //method 1 
alert($("#test").find(".inner").text());//method 2 and it was best one 
</script>

其中利用find方法是所有方法中效率最高的

当然,如果你是通过id选择符,也就是$("#..")来选择,不需要提供上下文参数.这对速度没有影响

将经常用的JQuery包装好的元素进行保存
如题,这点比较重要,因为使用$()对页面元素进行选择是需要耗费时间的.而保存为变量进行使用时,可以避免这种浪费,比如:

<ul> 
<li>one</li> 
<li>two</li> 
<li>three</li> 
<li>four</li> 
<li>five</li> 
</ul> 
<script type="text/javascript"> 
for (i = 0; i < $("ul li").length; i++) {//very bad,select $("ul li") so many times,waste a lot of time 
alert($("ul li")[i].innerHTML);//same here,very bad 
} 
var $li = $("ul li"); 
for (i = 0; i < $li.length; i++) {//good one,only selct $("ul li") once 
alert($li[i].innerHTML); //same here,good 
} 
</script>

从代码可以看到,避免多次重复选择可以提高性能:-)

尽量少用选择符
JQuery的选择器是面向数组的,所以在条件允许的情况下尽量少用选择器,比如:

<div id="Div0"></div> 
<div id="Div1"></div> 
<div id="Div2"></div> 
<script type="text/javascript"> 
$("#Div0").slideDown("slow"); 
$("#Div1").slideDown("slow"); 
$("#Div2").slideDown("slow");//slow $("Div0,Div1,Div2").slideDown("slow");//fast 
</script>

可以看出,使用选择器并用逗号将被选择的元素分开,并选择多个元素不仅让代码更加简洁,并且通过减少创建JQuery的实例所以在性能上也稍胜一筹!

在循环次数很多时避免使用$().each,而使用for循环
使用$().each方法让在进行循环时,会让编程更加轻松,少量的循环在使用$().each时对性能的影响可以忽略不计,但是当这个数字很大的时候,对性能的影响便开始变得可观了.

这个数字,我查了下资料,据说是1000以下可以使用$().each方法,而这个数字如果继续增加,则应该使用for循环语句。

尽量减少对DOM的操作
在页面中对DOM操作是比较消耗的(比如在页面插入或删除一段文字),把这个改动降至最小是保持性能的最佳实践!比如:

<ul id="test"> 
</ul> 
<script type="text/javascript"> 
var $list = $("#test"); 
for (i = 1; i < 101; i++) { 
$list.append("<li>Item" + i + "</li>"); 
} //very bad,change dom 100 times var listItem = ""; 
for (j = 1; j < 101; j++) { 
listItem += "<li>Item" + j + "</li>"; 
} 
$list.html(listItem); 
//good practice,only modify dom once 
</script>

可以看出,第一个例子对DOM修改100次,而第二个只对DOM修改1次,这上面的性能差距是显而易见的。

可以屏蔽JQuery的动画效果
在某些情况下,如果,可以关闭JQuery动画,能对性能进行一定提升,屏蔽的方法是:

<script type="text/javascript"> 
jQuery.fx.off = true; 
</script>

如果参数可以是JS对象,尽量使用对象
很对JQuery插件,或者JQuery的css和attr方法都接受键/值 或 js键/值对象 对作为参数,传递键值对象可以减少JQuery对象的创建,比如:
<div></div> 
<script type="text/javascript"> 
$("div").css("display", "block"); 
$("div").css("background-color", "blue") 
//slow,because it create more Jquery object $("div").css({ "display": "block", "background-color": "blue" }); 
//fast,only create one object 
</script>

当然也可以使用连缀的方式:
<div></div> 
<script type="text/javascript"> 
$("div").css("display", "block").css("background-color", "blue"); </script>

但是这种方式的性能不如上面那种.需要使用两个方法,并且需要多生成临时对象.

以上都是一些对JQuery性能提升的小Tips

Javascript 相关文章推荐
基于jquery固定于顶部的导航响应浏览器滚动条事件
Nov 02 Javascript
jQuery实现的倒计时效果实例小结
Apr 16 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
egg.js的基本使用和调用数据库的方法示例
May 18 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
May 09 Javascript
JS实现时间校验的代码
May 25 Javascript
Json实现传值到后台代码实例
Jun 30 Javascript
全网小程序接口请求封装实例代码
Nov 06 Javascript
利用node.js开发cli的完整步骤
Dec 29 Javascript
JS 的应用开发初探(mootools)
Dec 19 #Javascript
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 #Javascript
javascript demo 基本技巧
Dec 18 #Javascript
IE和Firefox下event事件杂谈
Dec 18 #Javascript
替代window.event.srcElement效果的可兼容性的函数
Dec 18 #Javascript
JavaScript 序列化对象实现代码
Dec 18 #Javascript
让div层随鼠标移动的实现代码 ie ff
Dec 18 #Javascript
You might like
mysql时区问题
2008/03/26 PHP
php与paypal整合方法
2010/11/28 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
高中生毕业自我鉴定
2013/10/10 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
离职保密承诺书
2014/05/28 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL