jQuery Optimization

现在jQuery已经出现在很多项目中,然而许多同学忽略了他的性能问题以及代码质量问题,

下面是我对jQuery的一些性能方面的学习.

选择器

选择器是jQuery中的核心功能,选择同一个DOM元素我们可以使用不同的方法。但是哪一种是最快的呢?

  1. if possible, please use more id selector. id selector is used javascript method getElementById

    //bad

    \(('#id selector')
    //good
    \)('#id')

    caution: don't use tag to decorate id selector

  2. Before using class selector, you'd better add tag. that's is used javascript method getElementsByTagName

    //bad

    \(('.class')
    //good
    \)('tag.class')

    caution: class selector is the slower selector, use less

  3. if possible, right more detail

    //bad

    \(('tag.class .class')
    //good
    \)('.class tag.class')

  4. when you select children, you'd better use find. the best way that cache the parent.

    var parent = $('#parent');

    var children = parent.find('children');

  5. 最慢选择器:伪类选择器和属性选择器,新的浏览器增加了querySelector()和querySelectorAll()方法,可能会使这两类选择器性能提升

  6. 从父元素选择子元素

    • $('child', \(parent)
      这种选择其实会执行\)parent.find('child'),排名第二
    • $('child', \(('parent'))
      这种选择会别转成\)('parent').find('child'),排名第三
    • $('#parent child')

      这种选择适合选择多级子元素,排名第六
    • $('#parent > child')

      这种选择和上面的相同,排名第五
    • \(parent.children('child')
      这种选择会被转换成\).sibling(),排名第四
    • $parent.find('child')

      这种选择会被转成getElementById,getElementByName,getElementByTagName等javascript原生语法,所以速度最快,排名第一
    总结:ID选择器是最快的选择器,建议多用。然后是标签选择器,其次是class选择器

函数

  1. 使用jQuery的内部函数data()来存储状态

  2. 尽量使用on方法来绑定事件,因为任何绑定方法都是最终使用on来实现的

代码质量

  1. 不要在循环中直接操作 DOM:

    // 性能差

    $.each(myArray, function(i, item) {

    var newListItem = '

  2. '+item+'
  3. ';

    $('#contain').append(newListItem);

    });

    // 性能好

    var html = '';

    $.each(myArray, function(i, item) {

    html += '

  4. ' + item + '
  5. ';

    });

    $('#contain').html(myHtml);

  6. 对数组循环时,缓存数组长度

    for(var i = 0, len = array.length; i < len; i++) {

    }
  7. 尽量少使用匿名函数,最好使用类封装

    var mo = {

    init: function() {

        }
    };
  8. 缓存变量,DOM遍历最消耗性能,所以尽量将重用的元素缓存

    height = $('#element').height();

    $('#element').css('height', height);

    // 好的做法

    $element = $('#element');

    height = $element.height();

    $element.css('height', height);

  9. 尽量少使用全局变量

    $ele = $('#element');

    // 最好使用var

    var $ele = $('#element');

  10. 简单的语句可以使用原生的javascript,因为jQuery最终执行的也是原生的

  11. 使用链式写法,因为使用链式写法jQuery自动缓存每一步的结果,因此比非链式写法要快

  12. 尽量少使用$.each进行循环,使用原生javascript的for和while来进行

  13. jQuery大部分方法都有两种,例如:\(().each与\).each

    $().each是基于jQuery对象的,jQuery对象会占用很多资源,因为他包含很多属性和方法
    $.each是基于jQuery方法的,不会占用太多资源,所以尽量使用这种方式

10.尽量使用\(.ajax,少使用\).get(),\(.getJSON(),\).post(),因为他们最终也是用的$.ajax()

减少代码嵌套:

减少代码嵌套,对于阅读和维护代码来时都是有益的,通过deffer我们可以减少代码的嵌套

      ***第一种:***
var request = function() {
var defer = $.Deferred();
$.ajax({url:'data/test.json'})
.done(function(data){
defer.resolve(data);
});
return defer;
}; $.when(request())
.then(function(data) {
console.log(data);
}); ***第二种:***
var request = function() {
return $.ajax({url:'data/test.json'});
}; $.when(request())
.then(function(data) {
console.log(data);
}); ***第三种:***
$.when($.ajax(url:'data/test.json'))
.then(function(data) {
console.log(data);
});

建议多阅读几遍jQuery源码,只有知道其中的实现原理才能更好的使用它

jQuery Source

编写高性能的jQuery代码的更多相关文章

  1. 编写高效的jQuery代码

    http://www.css88.com/jqapi-1.9/ 编写高效的jQuery代码 最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上 ...

  2. [转]编写高性能的Lua代码

    昨天晚上闲来无事,看室友在电脑上挂机玩游戏,用的一个辅助脚本,以为是lua写的脚本在跑,实际调查发现是按键精灵的脚本. 于是在网上找相关Lua开发游戏脚本的案例,看到一个人的博客,内容很不错,学到了很 ...

  3. 编写高性能的Lua代码

    编写高性能的Lua代码 Posted on2014/04/18· 10 Comments 前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件, ...

  4. 编写高性能的 Lua 代码

    前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件,手机游戏<大掌门><神曲><迷失之地>等都是用Lua来 ...

  5. 如何编写高效的jQuery代码

    jQuery的编写原则: 一.不要过度使用jQuery 1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大.所以有原生方法可以使用的场 ...

  6. 如何编写高效的jQuery代码(转载)

    jQuery的编写原则: 一.不要过度使用jQuery 1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大.所以有原生方法可以使用的场 ...

  7. 程序员笔记|如何编写高性能的Java代码

    一.并发 Unable to create new native thread …… 问题1:Java中创建一个线程消耗多少内存? 每个线程有独自的栈内存,共享堆内存 问题2:一台机器可以创建多少线程 ...

  8. (转载)编写高效的jQuery代码

    原文地址:http://www.cnblogs.com/ppforever/p/4084232.html 最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计 ...

  9. 如何编写好的jQuery代码

    本文就是自己看,如果您不小心进到了这里,请看源处,是这个作者翻译的:http://blog.sae.sina.com.cn/archives/4157 讨论jQuery和javascript性能的文章 ...

随机推荐

  1. oop klass

    https://www.infoq.com/articles/Introduction-to-HotSpot 借助HotSpot SA来一窥PermGen上的对象 找出栈上的指针/引用 虚拟机随谈(一 ...

  2. 图解TCP/IP笔记-网络基础知识

    1.计算机网络发展的7个阶段1)批处理服务器一次只能处理一批程序指令2)分时服务器可以分时为多台客户端服务3)计算机之间通信计算机之间由通信线路连接,互相通信4)计算机网络的产生通过分组交换技术,在不 ...

  3. C++内联函数详解

    1.函数调用原理 "编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址.计算机随后将逐步执行这些指令.有 ...

  4. Spring4.0系列9-websocket简单应用

    http://wiselyman.iteye.com/blog/2003336 ******************************************* Spring4.0系列1-新特性 ...

  5. 基于CSS3图片悬停放大特效

    今天我们要来分享一款很酷的CSS3图片特效,这款图片特效可以利用鼠标滑过图片使其悬停放大,并使图片的周围出现发光的效果.配合黑色的背景,这款CSS3图片悬停放大效果显得更加立体大气,非常适合产品图片的 ...

  6. 章鱼哥出品—VB.NET DataGridView绑定数据源 &quot;与货币管理器的位置关联的行不能设置为不可见&quot; 问题的解决

    DtaGridView绑定数据源后.假设想让数据条件显示的话,直接使用  My_Row.Visible = False就会出错.错误类型是 "与货币管理器的位置关联的行不能设置为不可见&qu ...

  7. 推荐一款编辑SQL的工具:jsqlparser

    这个工具真的挺好用的,采用的是观察者模式,Visitor. 虽然我学过这个模式,但是乍一用还是有点懵逼的. 给好一个SQL语句之后,jsqlparser可以把这个sql语句给分解成all kind o ...

  8. 路由表及route使用

    路由表 linux下通过route可以查看本地路由表: Kernel IP routing table Destination     Gateway         Genmask         ...

  9. eclipse安装中文补丁包

    第一步:打开http://www.eclipse.org/babel/ 第二步:找到downloads. 第三步:点击Oxygen. 第四步:找到简体中文的zip插件并兵下载. 第五步:解压. 第六步 ...

  10. Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常

    错误信息: “System.Data.Entity.Core.EntityCommandExecutionException”类型的异常在 EntityFramework.SqlServer.dll ...