15个值得开发人员关注的jQuery开发技巧和心得
2016-04-22 16:48
295 查看
在这篇文章中,我们将介绍15个让你的jQuery更加有效的技巧,大部分关于性能提升的,希望大家能够喜欢!
我们也可以使用免费的CDN服务,例如,Google来存放jQuery类库。
然而,我们应该避免使用复杂的选择器返回元素。更不用说很多用户使用老版本的浏览器,强迫jQuery去处理DOM树。这个方式非常慢。
选择id是最快速的方式。如果你需要使用class名称,那么你最好带上tag名称,这样会更快些。特别是在老浏览器和移动设备上。
访问DOM是javascript应用最慢的方式,因此尽量少使用。使用变量去保存选择器,这样会使用cache来保存。性能更好。
另外一个值得做的是jQuery给了你很多的额外便利选择器,例如,:visible,:hidden,:animated还有其它,这些不是合法的CSS3选择器。结果是你使用这些类库就不能有效地利用querySelectorAll()方法。为了弥补这个问题,你需要先选择元素,再过滤,如下:
如果性能是你关注的,那么使用简单for或者while循环来处理,而不是$.each(),这样能使你的代码更快。
检查长度也是一个检查你的collection是否含有元素的方式。
虽然上面的例子针对同样的元素,选择器则完全不一样。第二个实际上是非法的,你不可以使用它来创建一个对象。只能用来显示filter方法是用来缩小collection。
这也是quickEach方法的基础,你可以使用这种更快的方式而非each()。
博客中提到的:创建一个用来返回随机元素的选择器。你可以修改下面代码:
更好的在于,人们已经创建了一个支持CSShooks类库
缓动插件,它能够允许你给你的动画添加特效。唯一的缺点是你的访问者需要加载另外一个javascript文件。幸运的是,你可以简单的从插件拷贝效果,并且添加到jQuery.easing对象中,如下:
执行下面代码:
你将遇到问题,button会消失,不是panel。使用$.proxy方法,你可以这样书写代码:
这样才正确的执行。$.proxy方法接受两个参数,你最初的方法,还有context。这里阅读更多$.proxyinthedocs.。
以上代码返回的数值越小,网页加载速度越快。你可以考虑通过删除无用多余的元素来优化你的代码
你可以在这里阅读更多开发教程。
jQuery动画帮了我们大忙,否则我们得自己处理一堆的细节,设置timtout,处理属性值,跟踪动画变化等等。
大家可以参考这个文章:jQueryanimations
为了存取数据你需要调用如下代码:
data()的jQuery文档:data()inthejQuerydocs
但是对于老的浏览器来说,这个不是个好消息。因为他们不支持。但是我们可以使用jQuery的插件来提供支持一旦本地存储不能用的话。这种方式可以使得本地存储功能正常工作。
1.尽量使用最新版本的jQuery类库
jQuery项目中使用了大量的创新。最好的方法来提高性能就是使用最新版本的jQuery。每一个新的版本都包含了优化的bug修复。对我们来说唯一要干的就是修改tag,何乐而不为呢?我们也可以使用免费的CDN服务,例如,Google来存放jQuery类库。
<!--IncludeaspecificversionofjQuery--> <scriptsrc="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <!--Includethelatestversioninthe1.6branch--> <scriptsrc="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
2.使用简单的选择器
直到最近,返回DOM元素的方式都是解析选择器字符串,javascript循环和内建的javascriptAPI例如,getElementbyId(),getElementsByTagName(),getElementsByClassName()三种方式的整合使用。但是现代浏览器都开始支持querySelectorAll(),这个方法能够理解CSS查询器,而且能带来显著的性能提升。然而,我们应该避免使用复杂的选择器返回元素。更不用说很多用户使用老版本的浏览器,强迫jQuery去处理DOM树。这个方式非常慢。
$('li[data-selected="true"]a')//Fancy,butslow $('li.selecteda')//Better $('#elem')//Best
选择id是最快速的方式。如果你需要使用class名称,那么你最好带上tag名称,这样会更快些。特别是在老浏览器和移动设备上。
访问DOM是javascript应用最慢的方式,因此尽量少使用。使用变量去保存选择器,这样会使用cache来保存。性能更好。
varbuttons=$('#navigationa.button');//SomepreferprefixingtheirjQueryvariableswith$: var$buttons=$('#navigationa.button');
另外一个值得做的是jQuery给了你很多的额外便利选择器,例如,:visible,:hidden,:animated还有其它,这些不是合法的CSS3选择器。结果是你使用这些类库就不能有效地利用querySelectorAll()方法。为了弥补这个问题,你需要先选择元素,再过滤,如下:
$('a.button:animated');//DoesnotusequerySelectorAll() $('a.button').filter(':animated');//Usesit
3.数组方式使用jQuery对象
运行选择器的结果是一个jQuery对象。然而,jQuery类库让你感觉你正在使用一个定义了index和长度的数组。//Selectingallthenavigationbuttons: varbuttons=$('#navigationa.button'); //Wecanloopthoughthecollection: for(vari=0;i<buttons.length;i++){ console.log(buttons[i]);//ADOMelement,notajQueryobject } //Wecanevensliceit: varfirstFour=buttons.slice(0,4);
如果性能是你关注的,那么使用简单for或者while循环来处理,而不是$.each(),这样能使
检查长度也是一个检查你的collection是否含有元素的方式。
if(buttons){//Thisisalwaystrue //Dosomething } if(buttons.length){//Trueonlyifbuttonscontainselements //Dosomething }
4.选择器属性
jQuery提供了一个属性,这个属性显示了用来做链式的选择器。$('#containerli:first-child').selector//#containerli:first-child $('#containerli').filter(':first-child').selector//#containerli.filter(:first-child)
虽然上面的例子针对同样的元素,选择器则完全不一样。第二个实际上是非法的,你不可以使用它来创建一个对象。只能用来显示filter方法是用来缩小collection。
5.创建一个空的jQuery对象
创建一个新的jQuery空间能极大的减小开销。有时候,你可能需要创建一个空的对象,然后使用add()方法添加对象。varcontainer=$([]); container.add(another_element);
这也是quickEach方法的基础,你可以使用这种更快的方式而非each()。
6.选择一个随机元素
上面我提到过,jQuery添加它自己的选择器过滤。除了类库,你可以添加自己的过滤器。只需要添加一个新的方法到$.expr[':']对象。一个非常棒的使用方式是WaldekMastykarz的(function($){ varrandom=0; $.expr[':'].random=function(a,i,m,r){ if(i==0){ random=Math.floor(Math.random()*r.length); } returni==random; }; })(jQuery); //Thisishowyouuseit: $('li:random').addClass('glow');
7.使用CSSHooks
CSShooksAPI是提供开发人员得到和设置特定的CSS数值的方法。使用它,你可以隐藏浏览器特定的执行并且使用一个统一的界面来存取特定的属性。、$.cssHooks['borderRadius']={ get:function(elem,computed,extra){ //Dependingonthebrowser,readthevalueof //-moz-border-radius,-webkit-border-radiusorborder-radius }, set:function(elem,value){ //SettheappropriateCSS3property } }; //Useitwithoutworryingwhichpropertythebrowseractuallyunderstands: $('#rect').css('borderRadius',5);
更好的在于,人们已经创建了一个支持
8.使用自定义的缓动方法
你可能听到过jQuery的$.easing.easeInOutQuad=function(x,t,b,c,d){ if((t/=d/2)<1)returnc/2*t*t+b; return-c/2*((--t)*(t-2)-1)+b; }; //Touseit: $('#elem').animate({width:200},'slow','easeInOutQuad');
9.$.proxy()
使用callback方法的缺点之一是当执行类库中的方法后,context被设置到另外一个元素,例如:<divid="panel"style="display:none"> <button>Close</button> </div>
执行下面代码:
$('#panel').fadeIn(function(){ //thispointsto#panel $('#panelbutton').click(function(){ //thispointstothebutton $(this).fadeOut(); }); });
你将遇到问题,button会消失,不是panel。使用$.proxy方法,你可以这样书写代码:
$('#panel').fadeIn(function(){ //Using$.proxytobindthis: $('#panelbutton').click($.proxy(function(){ //thispointsto#panel $(this).fadeOut(); },this)); });
这样才正确的执行。$.proxy方法接受两个参数,你最初的方法,还有context。这里阅读更多
10.判断页面是否太过复杂
一个非常简单的道理,约复杂的页面,加载的速度越慢。你可以使用下面代码检查一下你的页面内容:console.log($('*').length);
以上代码返回的数值越小,网页加载速度越快。你可以考虑通过删除无用多余的元素来优化你的代码
11.将你的代码转化成jQuery插件
如果你要花一定得时间去开发一段jQuery代码,那么你可以考虑将代码变成插件。这将能够帮助你重用代码,并且能够有效的帮助你组织代码。创建一个插件代码如下:(function($){ $.fn.yourPluginName=function(){ //Yourcodegoeshere returnthis; }; })(jQuery);
你可以在这里阅读更多开发教程。
12.设置全局AJAX为缺省
如果你开发ajax程序的话,你肯定需要有”加载中“之类的显示告知用户,ajax正在进行,我们可以使用如下代码统一管理,如下://ajaxSetupisusefulforsettinggeneraldefaults: $.ajaxSetup({ url:'/ajax/', dataType:'json' }); $.ajaxStart(function(){ showIndicator(); disableButtons(); }); $.ajaxComplete(function(){ hideIndicator(); enableButtons(); }); /* //Additionalmethodsyoucanuse: $.ajaxStop(); $.ajaxError(); $.ajaxSuccess(); $.ajaxSend(); */
13.在动画中使用delay()方法
链式的动画效果是jQuery的强大之处。但是有一个忽略了的细节就是你可以在动画之间加上delays,如下://Thisiswrong: $('#elem').animate({width:200},function(){ setTimeout(function(){ $('#elem').animate({marginTop:100}); },2000); }); //Doitlikethis: $('#elem').animate({width:200}).delay(2000).animate({marginTop:100});
jQuery动画帮了我们大忙,否则我们得自己处理一堆的细节,设置timtout,处理属性值,跟踪动画变化等等。
大家可以参考这个文章:
14.合理利用HTML5的Data属性
HTML5的data属性可以帮助我们插入数据。特别合适前后端的数据交换。jQuery近来发布的data()方法,可以有效的利用HTML5的属性,来自动得到数据。下面是个例子:<divid="d1"data-role="page"data-last-value="43"data-hidden="true"
data-options='{"name":"John"}'>
</div>
为了存取数据你需要调用如下代码:
$("#d1").data("role");//"page"
$("#d1").data("lastValue");//43
$("#d1").data("hidden");//true;
$("#d1").data("options").name;//"John";
data()的jQuery文档:
15.本地存储和jQuery
本地存储是一个超级简单的API。简单的添加你的数据到localStorage全局属性中://Checkif"key"existsinthestorage
varvalue=$.jStorage.get("key");
if(!value){
//ifnot-loadthedatafromtheserver
value=load_data_from_server();
//andsaveit
$.jStorage.set("key",value);
}
//Usevalue
但是对于老的浏览器来说,这个不是个好消息。因为他们不支持。但是我们可以使用
相关文章推荐
- JQuery前端操作JSON
- jQuery中通过animate做一个简单的上下滑动的动画案例
- JQuery小技巧
- 用JavaScript 获取鼠标移动时的坐标(兼容:IE8、谷歌、Firefox)和用jquery方法的简单分析
- 在同一个页面使用多个不同的jQuery版本,让它们并存而不冲突
- 使用jQuery制作基础的Web图片轮播效果
- jquery animate回调函数小计
- 最牛x的滚动插件 – jquery的iscroll插件(附上下拉刷新消息demo)
- jquery.post()
- jQuery内部原理和实现方式浅析
- dom元素和jQuery元素互相调用方法
- jQuery日历控件
- $(function(){…}); jQuery(function($) {…}); $(document).ready(function(){…})的区别?
- Jquery 数组操作大全个人总结
- Jquery遍历checkbox获取选中项value值的方法
- jQuery中$是什么意思
- jQuery 监控键盘一段时间没输入
- jQuery插件库-收集最全最新最好的jQuery插件
- 浅析jQuery EasyUI响应式布局的实现方案
- 基于jquery.uploadify.js上传的测试环境