jQuery源码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码详解

本文主要是介绍jQuery源码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.1 源码

init: function( selector, context, rootjQuery ) {var match, elem, ret, doc;// Handle $(""), $(null), or $(undefined)//如果selector为空格,!selector为falseif (!selector) {//此时this为空jQuery对象return this;}// Handle $(DOMElement)//nodeType节点类型,利用是否有nodeType属性来判断是否是DOM元素if ( selector.nodeType ) {//将第一个元素和属性context指向selectorthis.context = this[0] = selector;this.length = 1;return this;}// The body element only exists once, optimize finding it//因为body只出现一次,利用!context进行优化if ( selector === "body" && !context && document.body ) {//context指向document对象this.context = document;this[0] = document.body;this.selector = selector;this.length = 1;return this;}// Handle HTML stringsif ( typeof selector === "string" ) {// Are we dealing with HTML string or an ID?//以<开头以>结尾,且长度大于等于3,这里假设是HTML片段,跳过queckExpr正则检查if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {// Assume that strings that start and end with <> are HTML and skip the regex checkmatch = [ null, selector, null ];} else {match = quickExpr.exec( selector );}// Verify a match, and that no context was specified for #idif ( match && (match[1] || !context) ) {// HANDLE: $(html) -> $(array)if ( match[1] ) {context = context instanceof jQuery ? context[0] : context;doc = ( context ? context.ownerDocument || context : document );// If a single string is passed in and it's a single tag// just do a createElement and skip the restret = rsingleTag.exec( selector );//如果是单独标签if (ret) {//如果context是普通对象if (jQuery.isPlainObject(context)) {//之所以放在数组中,是方便后面的jQuery.merge()方法调用selector = [document.createElement(ret[1])];//调用attr方法,传入参数contextjQuery.fn.attr.call( selector, context, true );} else {selector = [ doc.createElement( ret[1] ) ];}//复杂HTML的处理方法} else {ret = jQuery.buildFragment( [ match[1] ], [ doc ] );selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;}return jQuery.merge( this, selector );// HANDLE: $("#id")} else {elem = document.getElementById( match[2] );// Check parentNode to catch when Blackberry 4.6 returns// nodes that are no longer in the document #6963if ( elem && elem.parentNode ) {// Handle the case where IE and Opera return items// by name instead of ID//即使是documen.getElementById这样核心的方法也要考虑到浏览器兼容问题,可能找到的是name而不是idif ( elem.id !== match[2] ) {return rootjQuery.find( selector );}// Otherwise, we inject the element directly into the jQuery objectthis.length = 1;this[0] = elem;}this.context = document;this.selector = selector;return this;}// HANDLE: $(expr, $(...))//没有指定上下文,执行rootjQuery.find(),制定了上下文且上下文是jQuery对象,执行context.find()} else if ( !context || context.jquery ) {return ( context || rootjQuery ).find( selector );// HANDLE: $(expr, context)// (which is just equivalent to: $(context).find(expr)//如果指定了上下文,且上下文不是jQuery对象} else {//先创建一个包含context的jQuery对象,然后调用find方法return this.constructor( context ).find( selector );}// HANDLE: $(function)// Shortcut for document ready} else if ( jQuery.isFunction( selector ) ) {return rootjQuery.ready( selector );}//selector是jquery对象if ( selector.selector !== undefined ) {this.selector = selector.selector;this.context = selector.context;}//合并到当前jQuery对象return jQuery.makeArray( selector, this );},

其中里面调用的其他jQuery函数待后面再详细学习。

1、其中用到了两个正则表达式:

(1)quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;

解释:?:是非捕获组的意思,非捕获组只参与匹配,但不会把匹配到的内容捕获到组里,降低了内存的占用。

[^#<]*匹配除#<以外的任意字符,且出现0次或多次

(<[\w\W]+>):

\w表示匹配字母数字、下划线,\W正好相反,这里匹配的是以字母数字下划线作为第一个字母的一个标签,比如<div>

[^>]*匹配除>之外的所有字符,且出现0次或多次,$结束,表示结束时不能为>字符

#(\w\-]*)$  #id的匹配,id只能为字母、数字、下划线和减号

(2)rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;

解释:^<(\w+)\s*\/?>:

^<:以<开头

(\w+):匹配的字母、数字、下划线

\s*:匹配空格符0次或多次,比如可以匹配<div  >这样的

\/?>:匹配/符号0次或1次,比如匹配<img    />这样的

(?:<\/\1>):\1表示的是前面的(),这里指的就是(\w+),比如前面是<div>,这里就要是</div>

最后的?$表示的是此元素为截止符,要么截止在</div>,要么没有就是前面的<img >或者是<img />

到此就把所有的单独的标签的情况考虑完全了。

学以致用

<script type="text/javascript">var quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;var rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;var match = quickExpr.exec("abc<div>#id");if (match) {alert(RegExp.$1)}var match1 = rsingleTag.exec("<div></div>");if (match1) {alert(RegExp.$1);}</script>





这篇关于jQuery源码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666142

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H