当前位置:  编程技术>WEB前端

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

    来源: 互联网  发布时间:2014-08-25

    本文导语:  加载jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢。点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址。 代码如下:window.jQuery || document.write('') 2.安全起见,最好还是提供一个本地...

加载jQuery

1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢。点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址。

代码如下:


window.jQuery || document.write('')

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("

  • "+i+"
  • ");
    }

    // 这样好
    var $myList = $("#list");
    var list = "";
    for(var i = 0; i < 10000; i++){
        list += "
  • "+i+"
  • ";
    }
    $myList.html(list);

    // 但这样更好
    var array = [];
    for(var i = 0; i < 10000; i++){
        array[i] = "
  • "+i+"
  • ";
    }
    $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事件的处理程序放到外部文件中引入到页面,而页面中内嵌的代码只需调用即可。

    代码如下:



     // 初始经一些必要的全局变量
     $(document).ready(initPage); // 抑或 $(initPage);

    5.千万表写内联到HTML的JS代码,这是调试的梦魇!应该总是用jQuery来绑定事件自带程序,这样也方便随时动态地取消绑定。

    代码如下:

    my link
    $("#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"); // 多少还是会逊色于...

        
     
     

    您可能感兴趣的文章:

  • jQuery - css() 方法示例详解
  • jquery EasyUI导入js顺序详解
  • jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
  • jQuery focus和blur事件的应用详解
  • jquery操作select详解(取值,设置选中)
  • Jquery中"$(document).ready(function(){ })"函数的使用详解
  • Jquery性能优化详解
  • 数据库 iis7站长之家
  • Jquery遍历修改url请求参数的代码详解
  • jquery选择器之内容过滤选择器详解
  • JQuery动画animate的stop方法使用详解
  • jquery判断浏览器类型实例详解
  • jquery操作css样式表文件的方法详解
  • Jquery中$命名冲突问题详解
  • 详解jquery的substring,substr,split的用法
  • jquery中each的用法详解
  • jQuery.extend 函数的用法详解
  • jQuery之ajax删除详解
  • jquery与直接写JS的区别详解
  • jquery移除、绑定、触发元素事件使用示例详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过javascript库JQuery实现页面跳转功能代码
  • jQuery鼠标动画插件 jquery-ahover
  • jQuery概述,代码举例及最新版下载
  • jQuery向导插件 Jquery Wizard Plugin
  • Jquery操作html复选框checkbox:全选,全不选和反选
  • jQuery圆角插件 jQuery Corners
  • struts+spring+hibernate+jquery实现分页功能的几个基本类介绍(异步加载)
  • jQuery相册插件 jQuery.popeye
  • jQuery UI组件 jQuery UI
  • jQuery右键菜单插件 jQuery ContextMenu
  • jQuery分页插件 Pagination jQuery Plugin
  • jQuery日历插件 jQuery Week Calendar
  • jQuery的中文日历插件 jQuery.datePickerCn
  • jQuery实现CSS3动画效果的插件 jQuery Transit
  • jQuery的CSV插件 jQuery CSV
  • jQuery的气泡提示插件 jquery.ns_bub.js
  • jQuery气泡提示插件 jquery-rollover-tooltip
  • jQuery对话框 jQuery Modal Dialog
  • jQuery 插件 jQuery Ripples
  • 精简版的jQuery jQuery.ish
  • jQuery的OpenSocial插件 OpenSocial jQuery


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3