好像是feedly订阅里看到的文章,读完后觉得非常不错,译之备用,多看受益。
加载jQuery
1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢。点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址。
1 2 3 |
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="js/jquery-1.11.0.min.js" type="text/javascript"><\/script>')</script> |
2.安全起见,最好还是提供一个本地备份以便在无法从远程CDN服务器获取jQuery时网站也能工作,如上面代码所示。详情见此。
3.使用裸协议的URL(也就是说去掉http:或者https:),如上面代码展示的那样。
4.如果可能,尽量将你的JavaScript和jQuery代码放到页面底部。详情移步这里,或者查看一个HTML5页面标准模板。
5.该使用哪个版本?
- 如果你想兼容IE678请表用2.x的版本
- 针对极少数不用考虑兼容性的幸运儿,极力推荐使用最新版本的jQuery
- 当从CDN服务器加载jQuery时,最好把版本写全(比如1.11.0而不是1.11或者直接写个1)
- 千万莫重复加载
6.如果你同时还使用了其他JS框架诸如Prototype, MooTools, Zepto云云,因为他们也使用了$符号,所以你就表再用美刀符号来进行jQuery 编码了,而请用’jQuery’代替。并且调用$.noConflict()保证不会有冲突出现。
7.要检测浏览器对一些新特性是否支持,请用Modernizr。插播广告:论为毛不检测浏览器
关于变量
1.jQuery类型的变量最好加个$前缀。
2.时常将jQuery选择器返回的内容存进变量以便重用
1 2 |
var $products = $("div.products"); // 慢 var $products = $(".products"); // 快 |
3.使用驼峰命名
关于选择器
1.尽量ID选择器。其背后机理其实是调用原生的document.getElementById(),所以速度较其他选择器快。
2.使用类选择器时表指定元素的类型。不信你看这个性能比较
1 2 |
var $products = $("div.products"); // 慢 var $products = $(".products"); // 快 |
3.ID父亲容器下面再查找子元素请用.find()方法。这样做快的原因是通过id选择元素不会使用Sizzle引擎。详情看这里
4.多级查找中,右边尽量指定得详细点而左边则尽量简单点。了解更多
1 2 3 4 5 |
// 丑陋 $("div.data .gonzalez"); // 优化后 $(".data td.gonzalez"); |
1 2 3 4 |
$(".data table.attendees td.gonzalez"); // 好的方式:去掉了中间的冗余 $(".data td.gonzalez"); |
6.指定选择的上下文。
1 2 3 4 5 |
// 劣质的代码:因为需要遍历整个DOM来找到.class $('.class'); // 高品代码:因为只需在指定容器范围内进行查找 $('.class', '#class-container'); |
7.表使用万能选择器。查看具体阐释
1 2 |
$('div.container > *'); // 差 $('div.container').children(); // 棒 |
8.警惕隐式的万能选择器。省略的情况下其实使用的就是*号通配符。更多信息
1 2 |
$('div.someclass :radio'); // 差 $('div.someclass input:radio'); // 棒 |
9.ID已经表示唯一了,背后使用的是document.getElementById(),所以表跟其他选择器混搭了。
1 2 3 4 |
$('#outer #inner'); // 脏 $('div#inner'); // 乱 $('.outer-container #inner'); // 差 $('#inner'); // 干净利落,后台只需调用document.getElementById() |
DOM操作相关
1.操作任何元素前先将其从文档卸载,完了再贴回去。这事儿还能说细点
1 2 3 |
var $myList = $("#list-container > ul").detach(); //...一大堆对$myList的处理 $myList.appendTo("#list-container"); |
2.代码里将HTML组织好后再一次性贴到DOM中去。具体来说,性能比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 这样不好 var $myList = $("#list"); for(var i = 0; i < 10000; i++){ $myList.append("<li>"+i+"</li>"); } // 这样好 var $myList = $("#list"); var list = ""; for(var i = 0; i < 10000; i++){ list += "<li>"+i+"</li>"; } $myList.html(list); // 但这样更好 var array = []; for(var i = 0; i < 10000; i++){ array[i] = "<li>"+i+"</li>"; } $myList.html(array.join('')); |
3.不要处理不存在的元素。详情
1 2 3 4 5 6 7 |
// 无良的做法:jQuery后台要跑完三个函数后才会知道这个元素其实根本不存在 $("#nosuchthing").slideUp(); // 应该这样 var $mySelection = $("#nosuchthing"); if ($mySelection.length) { $mySelection.slideUp(); } |
事件相关
1.一个页面只写一个文档ready事件的处理程序。这样代码既清晰好调试,又容易跟踪代码的进程。
2.表用匿名函数来做事件的回调。匿名函数不易调试维护测试和复用。或许你想较真,看看这里吧
1 2 3 4 5 |
$("#myLink").on("click", function(){...}); // 表这样 // 这样 function myLinkClickHandler(){...} $("#myLink").on("click", myLinkClickHandler); |
3.处理文档ready事件的回调也表用匿名函数,匿名函数不易调试维护测试和复用:(
1 2 3 4 5 6 7 |
$(function(){ ... }); // 糟糕的做法:无法利用此函数也无法为其写测试用例 // 好的做法 $(initPage); // 抑或 $(document).ready(initPage); |