1. 避免使用 $.fn.each 或 $.each

因为它比原生的 for/while 真的会慢一些,循环次数越多差距越大。

另外,对象的 for-in 比 for 是要快一丢丢的,但数组的 for-in 要比 for 慢。

但是吧,方便呀,可以少好多变量,其实无所谓啦。

2. 选择器

始终要相信,原生的普遍要快一些,jquery 也是如此,

id 选择器 $('#id') / 元素标签选择器 $('input') / 类选择器 $('.class') 都是原生的

而伪类选择器 $(':hidden') / 属性选择器 $('[data-id]') 就相对更慢一些了

你猜用了 querySelector 或 querySelectorAll 后后两者会快些吗,自己快去试试吧

3. 父子关系

比较以下这 6 种获取子级元素的方法,发现 $parent.find('.child') 竟然最快

$('.child', $parent) 

↑ 其实还是会转化为 $parent.find('.child') 去寻找,所以何必呢

$parent.find('.child')

↑ 最原生的选择器去查找 .child,当然最快

$parent.children('.child')

↑ 其实内部会使用 siblings 和 nextSiblings 一个个区遍历节点,不管怎样都比 find 要慢

$('#parent > .child')

↑ jQuery 的 Sizzle 引擎是从右向左识别的,这很肝疼(虽然浏览器也是这样合并 DOM 树和样式树的,但那是无奈之举呀)

$('#parent .child')

↑ 与上同理,还要考虑多层级,速度就更慢了

4. 做好缓存

每个 jQuery 对象的开销其实不小,每次选择都会生成一个 jQuery 对象,而它又都有上百个属性,想想都可怕。因此:

var $obj = $('#xx');
$obj.find('.a');
$obj.find('.b')

$('#xx').find('.a');
$('#xx').find('.b');

可能快上一倍

5. dom 元素操作可用原生就用原生吧

$('#x').on('click', function(){
alert($(this).prop('id'));
alert(this.id);
});

两者相比,后者要快上许多许多。

同理:

$(this).hide(0);
this.style.display = 'none';

  

6. 使用链式写法

$('xx').find('p').eq(2).text('哈');

想想其实也应该懂的,免去了重复生成 jQuery 对象的开销

7. 改动 DOM 结构

众所周知,改动 DOM 结构的开销何其大,拉开十倍的速率差距都是可能的。

对大量 DOM 的插入还是使用先合并再插入比较好。而是使用 jQuery 元素的合并还是字符串的合并就得看安全要求和复杂程度了

对大量 DOM 的修改建议先用 detach 方法把元素取出,处理完毕后再插回文档

8. 存储数据

$('#xx').data(key, value);
$.data($('#xx'), key, value);

前者定义在元素对象的 prototype 上,后者定义在全局 $ 对象上(都是实例对象为什么这样会快其实我也没搞懂,还只想到这点,请大佬补充)

9. 事件委托

原生去写事件委托还是比较累的,所以使用 jQuery 很大程度上是因为 $.fn.on 和 $.ajax 是我的最爱

$('#parent').on('click', '.child', function(){});

相比去给每个 .child 都绑定 click 在元素超多时那是很烧的一件事

在看 jquery 源码中发现的一些优化方向的更多相关文章

  1. jQuery源码中的“new jQuery.fn.init()”什么意思?

    所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...

  2. Jquery源码中的Javascript基础知识(一)

    jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...

  3. jQuery源码中的赌博网站

    前言 jQuery源码中有赌博网站? 起因是公司发的一份自查文件,某银行在日常安全运营过程中发现在部分jQuery源码中存在赌博和黄色网站链接. 链接分为好几个: www.cactussoft.cn ...

  4. jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

    jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑 ...

  5. jQuery 源码中的 camelCase

    先看一下源码 //65-72行 // Matches dashed string for camelizing //匹配连字符 ‘-’ 和其后的第一个字母或数字,如果是字母,则替换为大写,如果是数字, ...

  6. Jquery源码中的Javascript基础知识(三)

    这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...

  7. Jquery源码中的Javascript基础知识(二)

    接上一篇,jquery源码的这种写法叫做匿名函数自执行 (function( window, undefined ) { // code })( window ); 函数定义了两个参数window和u ...

  8. 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释

    一.首先是最常见的闭包 (Closure) 范式自执行函数的写法,这里用匿名函数封装(构造块级作用域),避免了匿名函数内部的代码与外部之间发生冲突(如使用了相同的变量名). (function() { ...

  9. Jquery源码中的Javascript基础知识(四)— jQuery.fn.init方法

    $() 即调用了jQuery.fn.init方法 jQuery = function( selector, context ) { return new jQuery.fn.init( selecto ...

随机推荐

  1. java 定时器

    import java.io.IOException; import java.util.Timer; public class TimerTest { public static void main ...

  2. 图像增强之DDE---基于红外图像的数字图像细节增强DDE

    (1)DDE应用背景 (2)DDE算法简介 (3)DDE 实现 (4)DDE 总结和不足 ----------author:pkf -----------------time:2-9 -------- ...

  3. Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架

    本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...

  4. Laravel5.1 响应

    上篇笔记刚刚记录完请求 这节就来说说响应,一般来说啊 一个请求对应一个响应,用户都请求咱了 咱必须做一些逻辑后给人家反馈是不是,这就是响应. 1 基本的响应 我们前几篇笔记已经用过很多响应了,其中包括 ...

  5. shell 命令getopts用法

    写shell脚本常见sh test.sh -m 2 -d 3的写法 事例脚本: #!/bin/bash while getopts ":a:b:c:" arg #选项后面的冒号表示 ...

  6. PHP 规划(收藏的一些好博文)

    2014-10-15 01:30 36870人阅读 评论(34) 收藏 举报 分类: PHP/DHTML/Other(237) 版权声明:本文为博主原创文章,未经博主允许不得转载. PHP程序员的技术 ...

  7. TP系统常量信息

    [系统常量信息] 获取系统常量信息: 如果加参数true,会分组显示: 显示如下: [跨控制器调用] 一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法. 跨控制器调用可以节省我 ...

  8. JSF -> 导航(Navigation)

    在使用jsf框架时,肯定会用到faces-config.xml. 而其中就会出现很多的Navigation项. 其实这些Navigation就是一些页面跳转的东西. 以下内容来自http://blog ...

  9. Java实现单例模式的两种方式

    单例模式在实际开发中有很多的用途,比如我们在项目中常用的工具类,数据库等资源的连接类.这样做的好处是避免创建多个对象,占用内存资源,自始自终在内存中只有一个对象为我们服务. 单例对象一般有两种实现方式 ...

  10. js特殊字符过滤

    //匹配中文 数字 字母 下划线 var checkInput = function (str) { var pattern =var pattern = /^[\w\u4e00-\u9fa5]+$/ ...