jquery高级编程的最佳实践详解

 这篇文章主要介绍了jquery高级编程的最佳实践详解,学习JQ的朋友一定需要这个,参考下吧

加载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");
 
 
5.避免冗余。详情或者查看性能比较
 
 代码如下:
$(".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 = 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.不要处理不存在的元素。详情
 
代码如下:
// 无良的做法: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: { // 如果你想处理各状态的错误的话
        404: handler404,
        500: 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"); // 多少还是会逊色于...
 

时间: 2024-08-26 03:56:28

jquery高级编程的最佳实践详解的相关文章

jquery高级编程的最佳实践详解_jquery

加载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>wind

jquery插件开发继承了jQuery高级编程思路

要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈. 学会使用jQuery并不难,因为它简单易学,并且相信你接触jQuery后肯定也使用或熟悉了不少其插件.如果要将能力上升一个台阶,编写一个属于自己的插件是个不错的选择. 本教程可能不是最精品的,但一定是最细致的. jQuery插件开发模式 软件开发过程中是需要一定的设计模式来指导开发的,有了模式,

jQuery原理系列-常用Dom操作详解_jquery

1. 事件绑定$(el).bind ie使用attachEvent,其它浏览器使用addEventListener,不同的是ie多了个on前缀,this绑定在window上,需要用call和apply修正this 的指向. if (element.addEventListener) { element.addEventListener(type, handler, useCapture); } else { if (element.attachEvent) { element.attachEve

jQuery中getJSON跨域原理详解

jQuery中getJSON跨域原理详解  前几天我再开发一个叫 河蟹工具条 的时候,其中有个功能就是获取本页面的短网址. 这个想法是好的,可是在我付诸于行动的时候,发现这个需要跨域. 起初我的想法就是,跨域的最简单的方法就是增加一个script标签,因为script标签是允许跨域的. 但是问题又来了,对方的API返回的是个json对象,用script标签只能执行,却不能获取到里面的东西,也就是说返回的东西是不可控的. 随后我就想到了jQuery中的getJSON的方法,学习了一下,没想到里面的

《UNIX/Linux 系统管理技术手册(第四版)》——2.6 脚本编程的最佳实践

2.6 脚本编程的最佳实践 UNIX/Linux 系统管理技术手册(第四版) 虽然本章里的代码片段几乎不带注释,而且很少打印用法说明,只是因为我们已经列出了每个例子的大纲,从而体现出若干关键点.实际的脚本应该有更好的表现.有几本书通篇就讲编码的最佳实践,不过其中的基本指导原则如下. 如果运行脚本时带了不合适的参数,脚本应该打印一则用法说明,然后再退出.更好的做法是,也以这样的方式实现--help选项. 验证输入的有效性,并检查获得的输入值.例如,在对算出来的一个路径执行rm -fr操作之前,可能

jQuery中ajax - get() 方法实例详解_AJAX相关

在jquery中使用get,post和ajax方法给服务器端传递数据,在上篇文章给大家分享了jquery中ajax-post()方法实例,下面通过本文继续学习jQuery中ajax - get() 方法,具体介绍请看下文. jQuery Ajax 参考手册 实例 使用 AJAX 的 GET 请求来改变 div 元素的文本: $("button").click(function(){ $.get("demo_ajax_load.txt", function(resul

jQuery中ajax - post() 方法实例详解_AJAX相关

在jquery中的ajax有二个数据发送模式,一种是get,另一种是post(). jQuery Ajax 参考手册 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY 实例 通过 AJAX POST 请求改变 div 元素的文本: $("input").keyup(function(){ txt=$("input").val(); $.post("demo_ajax_gethint.asp

jQuery中deferred对象使用方法详解_javascript技巧

在jquery1.5之后的版本中,加入了一个deferred对象,也就是延迟对象,用来处理未来某一时间点发生的回调函数.同时,还改写了ajax方法,现在的ajax方法返回的是一个deferred对象. 那就来看看deferred对象的用法.1.ajax的链式回调  // ajax方法返回的是一个deferred对象,可以直接使用链式写法 $.ajax('test.json').done(function(resp){ // done 相当于success回调,其中默认的参数为success回调的

ejb-有没有EJB JPA数据库持久层开发实践详解的源代码,麻烦给一份

问题描述 有没有EJB JPA数据库持久层开发实践详解的源代码,麻烦给一份 解决方案 书籍网上有好多下载的,源代码没有,建议你可以从这里,买一份,光盘里有源代码http://www.amazon.cn/dp/B001B8RVAW