jQuery的init都做了些什么
// 初始化jQuery对象,即jQuery.fn.init对象
// @param selector 选择器,可能是DOM对象、html字符串、jQuery对象、函数或其他任意值。
// @param context 选择器选择的范围
// @param rootjQuery == $(document);
init: function( selector, context, rootjQuery ) {
var match, elem;
//如果selector是""、null、undefined、false,则返回this,这里的this指针指向init对象
//如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。
if ( !selector ) {
return this;
}
// 如果selector 是String类型,走该分支进行处理
if ( typeof selector === "string" ) {
// 如果selector的第一个字符是“<”并且最后一个字符是">",并且长度大于3
if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
// 将html储存入match数组中,并与另一个分支中的正则捕获相对应
// 如果走这个分支则说明选择器为<a>这种形式,则跳过使用正则匹配,不全都使用正则匹配的原因是,可能返回空。
match = [ null, selector, null ];
} else {
// rquickExpr 是在闭包中定义的局部变量,匹配得到的数组类似于:[全匹配, <tag>, #id]
match = rquickExpr.exec( selector );
}
// 如果match不为空,并且match[1]也就是<tag>存在或者context不存在??
if ( match && (match[1] || !context) ) {
// 如果是<tag>的形式
if ( match[1] ) {
// 如果context是jQuery对象,则取其中的第一个DOM元素作为context
context = context instanceof jQuery ? context[0] : context;
// 将通过parseHTML处理生成的DOM对象merge进jQuery对象
jQuery.merge( this, jQuery.parseHTML(
match[1],
//如果context存在并且是note节点,则context就是的顶级节点或自身,否则content=document
context && context.nodeType ? context.ownerDocument || context : document,
true
) );
// isPlainObject DOM节点和window不是纯对象
// rsingleTag 匹配一个独立的标签,例如<div></div> 或者 <div>
// 这个分支没读懂
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
if ( jQuery.isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
} else {
this.attr( match, context[ match ] );
}
}
}
return this;
//如果是#id的形式,走这个分支进行处理
} else {
//通过getEle方法获得DOM对象 将match[2]传入,是因为#id的形式是在第二个捕获组里面储存的。
elem = document.getElementById( match[2] );
// 如果该id元素存在并且该元素有父节点(判断父节点的原因是??)
if ( elem && elem.parentNode ) {
// 将该元素保存进jQuery对象数组当中,并设置其length值为1
this.length = 1;
this[0] = elem;
}
// 将jQuery的context属性设置为document,selector属性设置为selector
this.context = document;
this.selector = selector;
// 返回生成的jQuery对象
return this;
}
//如果context不存在或者context是jQuery对象 //通过检测是不是有jquery属性
} else if ( !context || context.jquery ) {
// 进入Sizzle进行处理(复杂的选择器)
return ( context || rootjQuery ).find( selector );
//context存在并且context不是jQuery对象的情况 先调用$(context),在进入Sizzle进行处理
} else {
return this.constructor( context ).find( selector );
}
//如果selector不是String,是DOM元素
} else if ( selector.nodeType ) {
//直接将DOM元素存入jQuery对象并设置context和length
this.context = this[0] = selector;
this.length = 1;
return this;
//此分支是为了简化$(document).ready(function(){});
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
//此处为什么不走else if?而是单独判断?
//如果selector是jQuery对象,则设置新jQuery对象的selector和context和原对象的一致。
if ( selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
//为最后一个if返回值。
return jQuery.makeArray( selector, this );
},
jQuery的init都做了些什么的更多相关文章
- 从架构演进的角度聊聊Spring Cloud都做了些什么?
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...
- 从架构演进的角度聊聊Spring Cloud都做了些什么
1.从架构演进的角度聊聊Spring Cloud都做了些什么?2.中小型互联网公司微服务实践-经验和教训3.Spring Cloud在国内中小型公司能用起来吗?
- 【dotnet跨平台】"dotnet restore"和"dotnet run"都做了些什么?
[dotnet跨平台]"dotnet restore"和"dotnet run"都做了些什么? 前言: 关于dotnet跨平台的相关内容.能够參考:跨平台.NE ...
- [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?
支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...
- linux中,当执行rpm -e删除一个软件包时,都做了些什么事
问题描述: 今天在通过rpm进行删除软件包时,出现了问题,就引发了我对于rpm包执行删除动作时的一些行为做了思考,之前找了很多的文章,后来想如果有debug日志信息,那么不就都清楚了吗 通过打印rpm ...
- 阿里巴巴AI Lab成立两年,都做了些什么?
https://mp.weixin.qq.com/s/trkCGvpW6aCgnFwLxrGmvQ 撰稿 & 整理|Debra 编辑|Debra 导读:在 2018 云栖人工智能峰会上,阿里巴 ...
- alloc 和 init都做了什么验证。
结论: alloc负责分配内存和创建对象对应的isa指针: init只是返回alloc生成的对象. 所以alloc后,多次调用init,返回的对象是同一个! 代码如下: // // main.m / ...
- dreamvc框架(三),dispartcher做了些什么
这一篇我会介绍一些dreamvc的核心类Dispatcher都做了些什么,首先我们先来看一看init方法,这是在DispatcherServlet和DispatcherFilter里面都会调用到的一个 ...
- 看看C# 6.0中那些语法糖都干了些什么(中篇)
接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想 ...
随机推荐
- Linux环境下Redis安装配置步骤[转]
在LInux下安装Redis的步骤如下: 1.首先下载一个Redis安装包,官网下载地址为:https://redis.io/ 2.在Linux下解压redis: tar -zxvf redis-2. ...
- mysql5.7 java读取乱码
一直很自信自己编码格式设置的都没有问题,以前就算遇到也都很快找到问题并解决.没想到掉进了5.7的坑里. 这段时间实习,大多做的都是.net+sqlserver,确实不用操心这些问题.主要还是各自默认编 ...
- js url?callback=xxx xxx的介绍
由于安全的原因,浏览器做了很多方面的工作,由此也就引入了一系列的跨域问题,需要注意的是: 跨域并非浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了.最好的例子是 CSRF ...
- UFLDL教程练习(exercise)答案(2)
主成分分析与白化,这部分很简单,当然,其实是用Matlab比较简单,要是自己写SVD分解算法,足够研究好几个月的了.下面是我自己实现的练习答案,不保证完全正确,不过结果和网站上面给出的基本一致. 1. ...
- swig和angular双花括号的冲突
swig和angular都用{{name}}来作为模板中变量的取值, 那么要共用的话怎么办: {% raw %}{{ foobar }}{% endraw %} 或者 config(['$interp ...
- 备份一篇SVN的文章, 从搭建到主备库
来源: http://h2ofly.blog.51cto.com/6834926/1539141 [svn简介] svn用于版本管理数据,它采用了分支管理系统.在它出现之前存在C ...
- Vim终极指南:所思即所得
https://blog.csdn.net/dc_726/article/details/78981756
- anaconda-ks.cfg详解
https://blog.csdn.net/whyhonest/article/details/7555229
- MongoDB使用经验总结
摘要: 最近在开发项目使用了数据库MongoDB,我将它的使用方法整理下分享给大家.至于mongoDB有什么优点,大家可以到官网去看. 安装: 首先我们需要到官网下载适合自己系统的mongodb. w ...
- Images.xcassets 的简单使用
总结起来Images.xcassets 就这么几句话 (1)以下開始简单整理 进入images.xcassets 右键--->New Image Set 或者点XCode的images.xcas ...