jquery源码解析
2016-03-02 23:00
369 查看
jquery源码剖析
概述
jquery 源码解析,参看代码是jquery 3.0版本jquery.js
入口jQuery.js包含core.js,以及jquery的各类功能的组合,包括selector,ajax等等然后将jquery对象导出到全局的jquery符号,以及$符号
core.js
确定jQuery对象是个函数,这个函数生成出来的数据是对象建立jquery的prototype的函数中,包括each,map的映射操作,first,last,eq等的数组操作,end这类的操作栈功能
建立extend函数,这个函数可以组合两个对象,可以设置为深组合,或浅组合的方式。如果函数只有一个参数时,则将extend参数组合到当前对象上。
建立jquery的函数,包括一堆类型判断:isWindow,isNumeric,isPlainObject,isEmptyObject,type,以及一堆集合操作:each,makeArray,inArray,merge,grep,map,还有一些常用的操作:trim,proxy,guid
总结:
core.js的目的是,建立jquery的根本属性,它是一个函数,调用后返回一个元素数组。以及这两部分的常用操作,集合操作,字符串操作,函数操作等等。
var文件夹
一堆关于类型判断,和获取数据的方法,封装是为了更好的兼容性。core文件夹
DomEval.js
动态执行某段js的代码,执行方式是在document的head建立一段script标签,而且script标签的内容为js代码,执行完毕后,将script标签删掉。为啥要这么做?因为这样做动态执行的js代码是保证在全局作用域上运行的,而eval执行的动态代码是跟执行位置有关,是在局部作用域上运行的。
parseHTML.js
这里是从html字符串建立一个dom元素的实现,方法是,然后这个字符串是简单字符串,就用context.createElement实现,如果这个字符串是嵌套字符串,就用createDocumentFragment创建临时元素,然后将字符串设置到它的innerHTML下。再返回fragements的childNodes即可。support.js
这个是用来兼容Safari 8 下不能直接createElement的问题ready.js
这里是确定jquery的ready执行时机,主要是通过原生的document.addEventListener(«DOMContentLoaded», xxx );和window.addEventListener(«load», completed );来确定ready的加载时机的。这里还用了允许改变ready时机的方法holdReady。init.js
这里是jquery函数的核心,$(),这个函数执行的内容如果第一个参数是个原生node,那么将它变成jQuery元素。
如果第一个参数是个函数,那么根据document.isReady的状态,来确定是否执行这个函数,还是说等待isReady后才执行这个函数。
如果第一个函数是个字符串,则继续分情况
1. 如果这个字符串前后带有尖括号,那么是要建立一个jquery元素,例如,这种$(’213’)。建立jquery元素的主要方法是用parseHTML.js建立原生dom元素,然后再合并到当前的jquery对象上。
2. 其他情况是走selector.js,将context下根据这个字符串查找对应的dom元素,例如,这种$(‘#id .mm’)
selector.js
很明显,这个文件是做dom查找操作的。selector的操作操作,有两个办法,一个是走jquery的sizzle引擎,一个是走浏览器的原生接口querySelectorAll的方法。selector-sizzle.js
这里就是直接将sizzle引擎包含进来了,然后将sizzle引擎的接口暴露为jquery对象的find,expr,uniqueSort,text,contains这些方法上了。这里就不多说了,需要另起一个谈sizzle引擎的实现。selector-native.js
uniqueSort 根据节点的在dom的位置来排序,然后对节点去重,这里用到了原生的compareDocumentPosition方法escape html的escape输出,用的是正则查找,然后替换。
find(selector, context,results) 在context下查找符合selector的元素,然后将结果与results合并,输出results,这里用到原生的querySelectorAll方法
text(elem) 获取elem的text值,递归合并元素的值或value,包含合并元素下的子元素
contains(a,b) 查找a元素是否包含b元素,通过不断地b元素回溯来确定a元素是否等于b元素。
matches( expr, elements ) 在elements中查找符合expr的elements列表,这里用到原生的matches或webkitMatchesSelector
traversing.js
这个文件的作用是定义了一堆jquery元素的遍历方法这些
has(target) 确定当前元素是否有target选择器的东西
closest( selectors, context) 确定当前元素的祖先节点是否含有selectors指定的元素
index(elem) 确定elem元素在当前元素的哪个位置
add(selector,context) 将$(selector,context)添加到当前元素的后方
addBack(selector) 将前一元素进行selector的filter,然后添加到当前元素的后方
还有这些
parent 直系父亲
parents 所有父亲
parentsUntil 所有父亲,直到unitl
next 后一个兄弟元素
prev 前一个兄弟元素
nextAll 后面所有的兄弟元素
prevAll 前面所有的兄弟元素
nextUntil 后面所有的兄弟元素,直到unitl
prevUntil 前面所有的兄弟元素,直到until
siblings 所有的兄弟元素
children 第一层的子元素
contents 所有层的子元素
相关文章推荐
- jquery 事件綁定
- JQuery+AJAX file upload demo (Python+flask as web server)
- js与jquery实现搜索框提示文字显示与隐藏
- 利用jQuery中hover()和cookie机制编写的小程序
- jQuery--加一行减一行
- jQuery--后台主机列表编辑
- IE8 jquery ajax获取静态资源报错TypeError 拒绝访问
- JqueryEasyUi
- jQuery与其他JS库的共存问题
- 关于jQuery新的事件绑定机制on()的使用技巧
- jquery.blockUI.2.31.js 弹出层项目介绍
- MVC+jQuery 无刷新导出EXCEL的过程(伪excel格式)
- jquery noConflict
- JQuery-复选框的操作(摘自<锋利的JQuery>)
- jquery function Optional Arguments
- jQuery的ready()事件与js中的onload事件的区别
- jquery表单验证框架 jquery.validate.min.js的使用
- jquery自学
- 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。
- jQuery MiniUI 在线示例