jQuery 学习笔记(源码)- 2.0.3 版本


1.x 版本与 2.x 版本的区别

  • 2.x 版本不再支持 IE6,7,8

简化框架

  • 2.0.3 版本的 jQuery 框架主要由以下部分组成

    框架核心 ![image.png](http://upload-images.jianshu.io/upload_images/5408683-c34d310254f40268.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  • 实现原理:

    • 因为 jQuery 中所有的属性和方法都是加在 jQuery 对象上的。而整个 jQuery 代码是被包在一个匿名函数中,此时 jQuery 对象是一个局部对象,如果外界想要调用 jQuery 上的方法,就需要 jQuery 向外界提供接口。
    • 第 8826 行就是 jQuery 向外界提供接口,这样外界就可以调用 jQuery 上的方法了
      window.jQuery = window.$ = jQuery;
  • jQuery 是以面向对象的思想实现的

      $("#div1").css();
      $("#div1").html();
    
      var arr = new Array();
      arr.push();
      arr.sort();
    

    上面代码中,arr 为一个数组对象,可以直接调用 push() 方法,而对比 jQuery 写法,$("#div1") 要么本身就是对象,要么就是一个函数,这个函数调用后返回一个对象


    返回结果是一个 jQuery 对象
  • jQuery 有两种使用方法
    1.$().css():之前说过,$() 是一个对象,因此 .css() 是这个对象构造函数上的方法。这个 实例方法 只能给 jQuery 对象使用。
    2.$.trim():$ 是个函数,因此 .trim() 是这个函数上的 静态方法(工具方法)。既可以给 jQuery 对象使用,也可以给原生 js 使用

  • (21 - 94) 定义了一些变量和函数 jQuery = function(){}

  • (96 - 283) 给 jQuery 对象,添加一些方法和属性

  • (349 - 817) jQuery.extend():扩展一些工具方法

  • (877 - 2856) Sizzle:复杂选择器的实现

    • Sizzle 也是一个独立的插件,可以在不使用 jQuery 的时候,单独去下载一个 Sizzle 文件使用
  • (2880 - 3042) Callbacks:回调对象:函数的一个统一管理

      // Demo
      function fn1(){
          alert(1)
      }
      function fn2(){
          alert(2)
      }
      var cb = $.Callbacks();      //  创建回调对象
      // $.Callbacks 是函数
      // 添加到 cb 上
      cb.add(fn1);
      cb.add(fn2);
      
      cb.fire();    //  1,2
      // 也可以删除    
      cb.remove(fn1);
      cb.fire();    //  2
    
  • (2880 - 3042)3043 - 3183 Deferred:延迟对象:对异步的统一管理

      // Demo
      var dfd = $.Deferred();     // 1.创建延迟对象
    
      dfd.done(function(){        // 2.设置需要延迟执行的回调函数
          alert(2);
      })
    
      setTimeout(function(){
          alert(1);
          dfd.resolve();          // 3.调用
      },1000);                    // 4.结果:刷新后等 1 秒弹 1,紧接再着弹 2
    
  • (2880 - 3042)3184 - 3295 support:功能检测:

2017 - 10 - 19 周四

  • (3308 - 3652) data():数据缓存:

      $('div').data('name','1123');
      alert($('div').data("name"));  //   注意,name 并没有直接加在 div 元素上
    
  • (3653 - 3797)queue:队列管理:

    • .queue() 入队,.dequeue() 出队
    • .animate() 是异步操作的,如何保证下面代码按顺序执行?实际上就是通过 queue 实现,先让 left 入队,执行完 left 后,让 left 出队,top 入队
      $("div").animate({left:100});
      $("div").animate({top:100});
      $("div").animate({width:100});
    
  • (3803 - 4299) attr() prop() val() addClass() 等:对元素属性的操作

  • (4300 - 5128) on() trigger():事件操作的相关方法

  • (5140 - 6057) DOM 操作:添加 / 删除 / 获取 / 包装 / DOM 筛选

  • (6058 - 6620) css():样式的操作

  • (6621 - 7854) 提交的数据和 ajax():ajax() / load() / getJson() 等

  • (7855 - 8584) animate():运动的方法

  • (8585 - 8792) offset() scrollTop():位置和尺寸的方法

  • (8804 - 8821) jQuery 支持模块化的模式

  • (8826) window.jQuery = window.$ = jQuery :对外提供的接口


2017 - 10 - 20 周五

(21 - 94) 定义了一些变量和函数 jQuery = function(){}

  • jQuery 源码中会有 #13335 这种注释代码,可以在 https://bugs.jquery.com 中搜素相应的代码查找到具体的问题

    关于 # 代码

  • jQuery 最外层会把 window 作为参数传到函数中,主要是基于以下两个原因:

    1. 查找速度快。如果不传 window,当 jQuery 内部某个函数调用 window 对象时,需从自身向外一层一层查找 window 对象,虽然最终也会查找到顶层函数外的 window,但速度会受到影响。因此直接传 window 使得内部函数想调用 window 对象时可以直接定位
    2. 方便压缩。 window 作为形参时,只是一个标识,在函数体内可以被压缩。
      (function(window,undefined){
          ...
          window
          ...
      })(window)   // window 作为实参
    
  • 严格模式,以下两种写法在严格模式下会报错

    "use strict"
    a = 2;          // 不写 var
    var b = 010;    // 八进制
    

2017 - 10 - 23 周一

  • window.location 等对象的存储,便于压缩。window.location 最终被压缩为一个 i
      location = window.location,
      document = window.document,
      docElem = document.documentElement,  // html 标签
    
压缩版
  • 防冲突机制:解决当其他库调用 $ 或者 jQuery 时的冲突问题


    防冲突
    <script type="text/javascript">
      var $ = 10;      //  如果没有这句,_$ 则会被赋值 undefined,因为 window.$ 并没有定义
    </script>
    <script type="text/javascript" src="jquery-2.0.3.js"></script>  // 如果注释掉,则下面 $ 为 10
    <script type="text/javascript">
      console.log($)  // 依然是 jquery 对象
    </script>
    
  • 关于实现方式
    实现方式
    • 常规的面向对象程序写法
      function Aaa(){};   //  1.创建构造函数
      Aaa.prototype.init = function(){};  //  2.一般会在原型上添加一个初始化方法
      Aaa.prototype.css = function(){};   //  3.添加原型上的其他方法
    
      var a1 = new Aaa();   // 4.实例化
      a1.init();      // 5.调用
      a1.css();
    
    • 简化的 jQuery 面向对象写法(注意,这里 fn 与 prototype 相同)


      fn 与 prototype 的关系
      function jQuery(){
        return new jQuery.fn.init();
      }
      jQuery.prototype.init = function(){};
      jQuery.prototype.css = function(){};
      jQuery().css();
    

    如果直接是这样的话会有个问题:css 方法明明是加在 jQuery 的原型上,为什么 jQuery(),即 new jQuery.fn.init() 可以调用?

    因为:
    原因

    可以看出, jQuery.fn.init.prototype 与 jQuery.prototype 是一样的,因此,加在 jQuery 上的方法 jQuery(),即 new jQuery.fn.init() 也可以调用

2017 - 10 - 25 周三

  • 匹配数字

    匹配数字

  • 匹配单词

    匹配单词

  • 匹配标签及 ID(防 XSS 攻击)

    匹配标签及 ID

  • 匹配空标签

    空标签

  • 浏览器前缀处理

    • 常规浏览器进行驼峰处理 -webkit-margin-left => webkitMarginLeft
    • IE 浏览器进行驼峰处理 -ms-margin-left => MsMarginLeft
      浏览器前缀处理
  • 驼峰回调函数

    驼峰回调函数

  • DOM 加载成功时触发的回调函数

    DOM 加载成功时触发的回调函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,750评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,065评论 1 10
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 114,354评论 24 450
  • 请参看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon阅读 7,127评论 2 19
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,171评论 0 1