热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jQuery源码简析

jQuery源码简析jQuery是一个js库通过js封装一些

jQuery源码简析

jQuery是一个js库 通过js封装一些方法让dom操作更简便提高开发效率

jQuery可以分为3大部分来看

第一部分jQuery的封装

在jQuery里 想要实现调用而不去污染其他变量封闭作用域当然用到了闭包配合立即执行函数来实现
在jQuery中 通过window.$ = window.jquery = jquery来把jQuery对象保存到全局上使其在别的模块中可以调用
在jQuery中 通过new jQuery.prototype.function来包装成了jQuery对象来方便方法调用

(function(){
function jQuery (select){
return new jQuery.prototype.init(select); //把构造函数保存出来 包装成实例化对象
}
());
window.$ = window.jquery = jquery //把jQuery保存到全局上方便调用

第二部分jQuery的方法封装

在jQuery方法的封装上就是在jQuery原型上写对dom的操作方法 以下是我写的一些比较典型的方法 还有比较注意的地方就是链式调用在方法最后return this来实现 在源码中方法都写在了实参里 这样可以减少在原型链上频繁调用

(function(){
function jQuery (select){
return new jQuery.prototype.init(select); //把构造函数保存出来 包装成实例化对象
}
jQuery.prototype.css = function(config){
for(var i = 0;i for(var attr in config){ //把每个config拿出来
this[i].style[attr] = config[attr]; //把config 设在this[i]上
}
}
return this; //链式操作 拿到谁把谁再返回出去方便下次操作
}
jQuery.prototype.get = function(num){
// if(num == null){
// return [].slice.call(this,0);
// }else{
// if(num >= 0){
// return this[num];
// }else{
// return this.[num + this.length]
// }
// }
//简写 双重判断
return num != null ? (num >= 0 ? this[num] : this[num + this.length]) : [].slice.call(this,0);
}
jQuery.prototype.eq = function(num){
var dom = num != null ? (num >= 0 ? this[num] : this[num + this.length]): null;
return jQuery(dom) //包裹成jQuery对象
}
jQuery.prototype.add = function(select){
var curObj = jQuery(select);
var baseObj = this;
var newObj = jQuery();
for(var i = 0; i newObj[this.length++] = curObj[i]; //把curObj 放入nweObj
}
for(var i = 0; i newObj[this.length++] = baseObj[i]; //把baseObj 放入newObj
}
return newObj;
}
jQuery.prototype.on = function(type,handle){
for(var i = 0;i if(!this[i].cacheEvent){
this[i].cacheEvent = {}; //创建缓存对象
}
if(!this[i].cacheEvent[type]){ //缓存中是否有type类型
this[i].cacheEvent[type] = [handle]
}else{
this[i].cacheEvent[type].push(handle); //把执行函数放进去
}
}
}
jQuery.prototype.trigger = function(type){
var params = arguments.length > 1 ? [].slice.call(arguments,1) : [];
var self = this;
for(var i = 0; i this[i].cacheEvent[type].foreach(function(ele,index){
ele.apply(self,params)
})
}
}
jQuery.prototype.Queue = function(){ //type 起的队列名字 handle 队列内容 type,handle
var queueObj = this; //jQuery对象
var queueName = arguments[0] || 'fx'; //传参第一位 队列起名
var addFunc = arguments[1] || null; //传参第二位 队列内容
var len = arguments.length;
if(len == 1){
return queueObj[0][queueName]; //有名字的话把名字传进来
}
//判断 dome对象有么有名字 没有名字填入名字有名字把内容填进去
queueObj[0][queueName] == undefined ? queueObj[0][queueName] = [addFunc] : queueObj[0][queueName].push(addFunc);
return this;
}

jQuery.prototype.Dequeue = function(type){
var self = this; //外部jq对象
var queueName = arguments[0] || 'fx'; //传进来的队列名
var queueArr = this.Queue(queueName); //把这个队列拿出来
var currFunc = queueArr.shift(); //把队列里的值删掉
//判断队列里有没有值了 没有值就成为递归出口
if(currFunc == undefined){
return;
}
var next = function() { //巧妙用next参数进行下一次出队
self.Dequeuee(queueName);
}
currFunc(next);
return this;
}
jQuery.prototype.Deferred = function(){
var arr = [
[
jQuery.callbacks('once memory'),'done','resolve' //done 已完成的 memory 内存 once 一次 resolve解决 决定
],[
jQuery.callbacks('once meomry'),'fail','reject' //fail 失败的 regect 拒绝的
],[
jQuery.callbacks('memory'),'progress','notify' //progress 前进中的 notify 通知
]
];
var pendding = true;
var deferred = {};

for(var i = 0 ; i deferred[arr[i][1]] = (function (index){
return function(func){
arr[index][1].add(func)
}
})(i);
deferred[arr[i][2]] = (function (index){
return function(func){
var args = arguments;
if(pendding){
arr[index][0].fire.apply(window,args);
arr[index][2] == 'resolve' || arr[index][2] == 'reject' ? pendding = false : '';
}
}
})(i)
}
return deferred;
}
());
window.$ = window.jquery = jquery //把jQuery保存到全局上方便调用

第三部分init()选择器的封装 也是最重要的部分

在init里是对$()选择出来的的参数进行一系列的处理这一部分比较复杂 有一部分原生js选择器 有通过正则来匹配选择内容的 还有很多


推荐阅读
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
author-avatar
老海文
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有