jQuery编程的最佳实践
好像是feedly订阅里看到的文章,读完后觉得非常不错,译之备用,多看受益。
加载jQuery
1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢。点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址。
<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选择器返回的内容存进变量以便重用
var $products = $("div.products"); // 慢
var $products = $(".products"); // 快
3.使用驼峰命名
关于选择器
1.尽量ID选择器。其背后机理其实是调用原生的document.getElementById(),所以速度较其他选择器快。
2.使用类选择器时表指定元素的类型。不信你看这个性能比较
var $products = $("div.products"); // 慢
var $products = $(".products"); // 快
3.ID父亲容器下面再查找子元素请用.find()方法。这样做快的原因是通过id选择元素不会使用Sizzle引擎。详情看这里
4.多级查找中,右边尽量指定得详细点而左边则尽量简单点。了解更多
// 丑陋
$("div.data .gonzalez"); // 优化后
$(".data td.gonzalez");
$(".data table.attendees td.gonzalez"); // 好的方式:去掉了中间的冗余
$(".data td.gonzalez");
6.指定选择的上下文。
// 劣质的代码:因为需要遍历整个DOM来找到.class
$('.class'); // 高品代码:因为只需在指定容器范围内进行查找
$('.class', '#class-container');
7.表使用万能选择器。查看具体阐释
$('div.container > *'); // 差
$('div.container').children(); // 棒
8.警惕隐式的万能选择器。省略的情况下其实使用的就是*号通配符。更多信息
$('div.someclass :radio'); // 差
$('div.someclass input:radio'); // 棒
9.ID已经表示唯一了,背后使用的是document.getElementById(),所以表跟其他选择器混搭了。
$('#outer #inner'); // 脏
$('div#inner'); // 乱
$('.outer-container #inner'); // 差
$('#inner'); // 干净利落,后台只需调用document.getElementById()
DOM操作相关
1.操作任何元素前先将其从文档卸载,完了再贴回去。这事儿还能说细点
var $myList = $("#list-container > ul").detach();
//...一大堆对$myList的处理
$myList.appendTo("#list-container");
2.代码里将HTML组织好后再一次性贴到DOM中去。具体来说,性能比较
// 这样不好
var $myList = $("#list");
for(var i = ; i < ; i++){
$myList.append("<li>"+i+"</li>");
} // 这样好
var $myList = $("#list");
var list = "";
for(var i = ; i < ; i++){
list += "<li>"+i+"</li>";
}
$myList.html(list); // 但这样更好
var array = [];
for(var i = ; i < ; i++){
array[i] = "<li>"+i+"</li>";
}
$myList.html(array.join(''));
3.不要处理不存在的元素。详情
// 无良的做法:jQuery后台要跑完三个函数后才会知道这个元素其实根本不存在
$("#nosuchthing").slideUp();
// 应该这样
var $mySelection = $("#nosuchthing");
if ($mySelection.length) {
$mySelection.slideUp();
}
事件相关
1.一个页面只写一个文档ready事件的处理程序。这样代码既清晰好调试,又容易跟踪代码的进程。
2.表用匿名函数来做事件的回调。匿名函数不易调试维护测试和复用。或许你想较真,看看这里吧
$("#myLink").on("click", function(){...}); // 表这样 // 这样
function myLinkClickHandler(){...}
$("#myLink").on("click", myLinkClickHandler);
3.处理文档ready事件的回调也表用匿名函数,匿名函数不易调试维护测试和复用:(
$(function(){ ... }); // 糟糕的做法:无法利用此函数也无法为其写测试用例 // 好的做法
$(initPage); // 抑或 $(document).ready(initPage);
function initPage(){
// 这里你可以进行程序的初始化了
}
4.进一步,最好也将ready事件的处理程序放到外部文件中引入到页面,而页面中内嵌的代码只需调用即可。
<script src="my-document-ready.js"></script>
<script>
// 初始化一些必要的全局变量
$(document).ready(initPage); // 抑或 $(initPage);
</script>
5.千万表写内联到HTML的JS代码,这是调试的梦魇!应该总是用jQuery来绑定事件自带程序,这样也方便随时动态地取消绑定。
<a id="myLink" href="#" onclick="myEventHandler();">my link</a> <!--不好 -->
$("#myLink").on("click", myEventHandler); // GOOD
6.如果可能尽量在绑定事件处理程序时使用一个命名空间,这样可以方便地取消绑定而不会影响其他绑定。
$("#myLink").on("click.mySpecialClick", myEventHandler); // 不错
// 之后,让我们优雅地解除绑定
$("#myLink").unbind("click.mySpecialClick");
异步操作
1.直接用$.ajax()而表去用.getJson() 或 .get(),因为jQuery内部还是将其转为前者
2.表对HTTPS站点使用HTTP去发起请求,最好干脆就表指定(将HTTP或者HTTPS从你的URL中移除)
3.表在链接里面嵌参数,请使用专门的参数设置来传递
// 不易阅读的代码...
$.ajax({
url: "something.php?param1=test1¶m2=test2",
....
}); // 更易阅读...
$.ajax({
url: "something.php",
data: { param1: test1, param2: test2 }
});
4.尽量指明数据类型以便你自己清楚要处理什么样的数据(见下方会提到的Ajax模板)
5.对于异步动态加载的内容,最好使用代理来绑定事件处理程序。这样的好处是对于之后动态加载的元素事件同样有效。你或许想了解更多
$("#parent-container").on("click", "a", delegatedClickHandlerForAjax);
6.使用Promise模式。更多例子
$.ajax({ ... }).then(successHandler, failureHandler); // 抑或
var jqxhr = $.ajax({ ... });
jqxhr.done(successHandler);
jqxhr.fail(failureHandler);
7.标准的Ajax模板一分。追寻根源
var jqxhr = $.ajax({
url: url,
type: "GET", // 默认为GET,你可以根据需要更改
cache: true, // 默认为true,但对于script,jsonp类型为false,可以自行设置
data: {}, // 将请求参数放这里.
dataType: "json", // 指定想要的数据类型
jsonp: "callback", // 指定回调处理JSONP类型的请求
statusCode: { // 如果你想处理各状态的错误的话
: handler404,
: handler500
}
});
jqxhr.done(successHandler);
jqxhr.fail(failureHandler);
动画与特效
1.保持一个始终如一风格统一的动画实现
2.紧遵用户体验,表滥用动画特效
- 使用简洁的显示隐藏,状态切换,滑入滑出等效果来展示元素
- 使用预设值来设置动画的速度'fast','slow',或者400(中等速度)
插件相关
1.始终选择一个有良好支持,完善文档,全面测试过并且社区活跃的插件
2.注意所用插件与当前使用的jQuery版本是否兼容
3.一些常用功能应该写成jQuery插件。一分jQuery插件的编写模板
链式句法
1.除了用变量将jQuery选择器返回的结果保存,还可以利用好链式调用。
$("#myDiv").addClass("error").show();
2.当链式调用多达3次以上或代码因绑定回调略显复杂时,使用换行和适当的缩进来提高代码的可读性。
$("#myLink")
.addClass("bold")
.on("click", myClickHandler)
.on("mouseover", myMouseOverHandler)
.show();
3.对于特别长的调用最好还是用变量保存下中间结果来简化代码。
其他
1.使用对象字面量来传递参数
$myLink.attr("href", "#").attr("title", "my link").attr("rel", "external"); // 糟糕:调用了三次attr
// 不错,只调用了一次attr
$myLink.attr({
href: "#",
title: "my link",
rel: "external"
});
2.表将CSS与jQuery杂揉
$("#mydiv").css({'color':red, 'font-weight':'bold'}); // 不好
.error {/* 不错 */
color: red;
font-weight: bold;
}
$("#mydiv").addClass("error");
3.时刻关注官方Changelog,表使用摒弃了的方法。点此查看所有废弃的方法
4.适时地使用原生JavaScript。一些与此有关的性能比较
$("#myId"); // 多少还是会逊色于...
document.getElementById("myId");
REFERENCE
原文:Coding Standards & Best Practices http://lab.abhinayrathore.com/jquery-standards/
原文的reference
- jQuery Performance: http://learn.jquery.com/performance/
- jQuery Learn: http://learn.jquery.com
- jQuery API Docs: http://api.jquery.com/
- jQuery Coding Standards and Best Practice: http://www.jameswiseman.com/blog/2010/04/20/jquery-standards-and-best-practice/
- jQuery Plugin Boilerplate: http://stefangabos.ro/jquery/jquery-plugin-boilerplate-revisited/
jQuery编程的最佳实践的更多相关文章
- javascript编程的最佳实践推荐
推荐的javascript编程的最佳实践,摘要记录在这里: 可维护的代码保证代码的性能部署代码 1 可维护的代码1.1什么是维护的代码:可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原 ...
- python高级编程之最佳实践,描述符与属性01
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的 ...
- [01] C#网络编程的最佳实践
网络框架的选择 C++语言里面有asio和libuv等网络库, 可以方便的进行各种高效编程. 但是C#里面, 情况不太一样, C#自带的网络API有多种. 例如: Socket TcpStream(同 ...
- Android学习之基础知识十二 — 第二讲:网络编程的最佳实践
上一讲已经掌握了HttpURLConnection和OkHttp的用法,知道如何发起HTTP请求,以及解析服务器返回的数据,但是也许你还没发现,之前我们的写法其实是很有问题的,因为一个应用程序很可能会 ...
- GOLANG接口编程的最佳实践一 (sort.Sort(data Interface ) )
package main import( "fmt" "sort" "math/rand" ) //定义一个武当派的结构体 type Wud ...
- 【转】jQuery最佳实践
上周,我整理了<jQuery设计思想>. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery".今天的文章则是更进一步,讲解"如何用好jQu ...
- Javascript模块化编程(一)模块的写法最佳实践六、输入全局变量 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...
- JQuery系列(7) - JQuery最佳实践
上篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery".今天的文章则是更进一步,讲解"如何用好jQuery". 我主要参考了Addy Osman ...
- Javascript模块化编程(一)模块的写法最佳实践
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...
随机推荐
- Arduino uno LED灯实验
http://jingyan.baidu.com/article/a65957f4e358d924e67f9bad.html
- web安全入门书单
- js转换数据库中DateTime字段类型
在程序中,从数据库中读取到的日期时间类型数据一般是这种格式:"/Date(1355109408000+0800)/" 要经过js函数处理变为格式:'2012-12-10 11:05 ...
- 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 2012-04-25 16:29:04| 分类: 学习 |字号 订阅 在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE ...
- Programming Language A 学习笔记(二)
1. 语法糖--元组的"名称引用"与"位置引用": (e1,...,en) <=> {1=e1,...,n=en} 类型:t1 * - * tn & ...
- jQuery 遍历函数
转载http://www.cnblogs.com/tylerdonet/archive/2013/04/05/3000618.html jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函 ...
- 2016 正确 sublime安装PHPcs PHPcodesniffer代码规范提示插件,修正网上部分不详细描述
对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香!-------------------14:37 2016/3/212016 正确 sublime安装PHPcs PHPcodesniff ...
- 【转】php Thread Safe(线程安全)和None Thread Safe(NTS,非 线程安全)之分
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- 使用Prerender.io为angular项目做SEO
现在的项目的为了更好的分工明确,降低耦合都开始采用前后端分离的形式进式开发,我们也采用这种开发形式,前端用angular开发.虽说刚开始也遇各种坑,但是后期熟悉了之后简直爽呆.一个比较大的坑就是SEO ...
- 安装WampServer时出现的问题(丢失VCRUNTIME140.dll或MSVCR110.dll)以及解决办法
今天,在安装WampServer时,刚开始提示了"丢失VCRUNTIME140.dll"的问题. 我就网上查了一下,结果大家说是没有安装VC++,然后我就按照网友们提供的网址去下载 ...