学习源码第四天(昨天只看了一点正则,发现正则真的水很深,但很有魅力)

第三天主要对match的值做了一个判断    match[1]要么是标签字符串,要么macth就是null     像<li>、<li>11都转成‘li‘作为match[1]。

match[1]现在‘<li><li>‘ 或 ‘<li>‘

if (match && (match[1] || !context)) // 判断 id 是否有环境context限制,只有没有限制(不写默认document,这里的匹配就是不写第二个参数的情况) $(‘#box‘)

①满足match有值,即匹配rquickExpr , ② $(‘<li>‘)、$(‘<li>‘,document)、$(‘<li>‘,其他环境如iframe,第三方插件) ,match[1] || ! context  当match[1]存在就是标签,match[2]存在就是#aa的形式,因为如果if成立match确定存在,当match[2]存在然后满足context这个环境不存在即可(不存在即默认是在document也就是本文档中)

我所理解的context : 假如说我在本html页面的body里面添加了一个<div id="box">,那么$(‘#box‘),可以获取,但是我不在当前html文件创建,我跑到其他html页面创建,然后通过iframe引进来,这时候$("#box",context),第二个参数context就起作用了(iframe用得不多,所以一般来说context不写默认document就好),同理在第三方插件中可能也有#box这个id元素。可以说jquery被大家这么广为流传不是没有原因的,兼顾到了不常用的情况,像iframe在H5都废弃了。

补充一下:需要了解正则表达式.exec()的朋友:http://www.w3school.com.cn/js/jsref_exec_regexp.asp

 1 if (match[1]) { //创建标签 --
 2             context = context instanceof jQuery ? context[0] : context;
 3
 4             // scripts is true for back-compat
 5             jQuery.merge(
 6               this,
 7               jQuery.parseHTML(
 8                 match[1],
 9                 context && context.nodeType? context.ownerDocument || context : document,
10                 true
11               )
12             );

if (match[1]) 不是‘#aa’,这种id的情况,是‘<aaa>‘这种情况尖括号开头结尾

context = context instanceof jQuery ? context[0] : context; // $(‘<li>‘,$(document))或 $(‘<li>‘,$(‘ul‘)) $(document)[0],原生document就是document,那么jquery会从ul下面去找,说通俗点就是一个查找域,经过这行代码转变成原生节点,后续需要用到原生DOM对象这一性质,但这一代码并不能保证无意义的字符串$(‘li‘,‘uu‘),uu在节点上根本没有的情况这行代码不做判断因为context直接逻辑短路
// 插入script标签jQuery.merge(
              this,
              jQuery.parseHTML(
                match[1],
                context && context.nodeType
                  ? context.ownerDocument || context
                  : document,
                true
              )
            );

jQuery.parseHTML()的作用如下:var str = "<li>1</li><li>2</li><li>3</li>";jQuery.parseHTML(str) 返回的数组[li,li,li],每个li都是一个DOM原生对象。

接下来看一下三个参数,一个节点字符串,一个查找域,一个布尔值

match[1]:各种‘< 里面可以是任意字符 >‘类型

查找域 :context && context.nodeType ? context.ownerDocument || context : document    【此时context已是原生节点】【如果context不存在就是默认document】【如果存在并且是DOM节点的话,context可以是本身也可以是context.ownerDocument属性一样的思议】

布尔值:默认是false,true的话处理的是‘<script></script>‘标签插入的情况,这么写不行,如果前面有script标签,会认为配对所以要转义‘<script><\/script>‘,然后就算这样加入到DOM节点还是起不到js效果,只有设置了true才会在DOM节点上起js效果。

然后看jQuery.merge(this,返回的节点数组):this指向jQuery构造函数,将返回的节点数组和this合并要有length属性,需要和数组的length属性相加。 这样的结果就是this中新增了原生的节点,但是却是用原本对象的最后一个数字属性名(已经被对象的length截取之后)之后再去拼接的

简单说说:
如果obj1 = { ‘3‘ : ‘哈哈‘,length : 4} arr = [1,2,3] $.merge(obj1,arr) //代表的就是{ ‘3‘ : ‘哈哈‘,‘4‘:1, ‘5‘:2,‘6‘:3,length : 7}

所以明白了为什么$()[0]可以拿到原生节点,因为改造了this这个jQuery构造函数的实例

下面是我另写的一篇关于$.merge()的:https://www.cnblogs.com/wchjdnh/p/10763451.html

// HANDLE: $(html, props)

        //rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/ ---<aaa></aaa、<aaa />、<aaa /></aaa>这几种情况 |在当前正则表达式中表明了后面可以没有

            if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {  //满足一对标签或单标签和 第二个参数是纯对象形式 $(‘<li></li>‘,{ title : ‘我是li‘ , html : ‘hh‘,css:{color:‘red‘} })
              for (match in context) {   // 属性遍历context,这是对象遍历match不一定是数字字符串
                // Properties of context are called as methods if possible
                if (jQuery.isFunction(this[match])) {  //判断this[match]是不是方法
                  this[match](context[match]);  //是方法就调用参数是context[match]的值 ,也就是说$(‘<li></li>‘,{ title : ‘我是li‘ , html : ‘hh‘,css:{color:‘red‘} })中像html,css都是jQuery的方法,那就直接调用
                  // ...and otherwise set as attributes
                } else {
                  this.attr(match, context[match]); //不是方法作为属性设置 title不是方法直接处理用设置属性的方式
                }
              }
            }           return this; //创建标签结束,因为是创建标签操作,其他代码的操作不执行return,创建标签结束返回的是jQuery对象  比方说$(‘<li>1</li>‘).appendTo(‘ul‘)返回li的jQuery对象      // return this是结束创建标签节点的相关操作 同时return this就是返回工厂函数jQuery(这时候看成工厂函数)创造的this,这个this已经被改造成了有原生DOM节点的jQuery对象实例了

原文地址:https://www.cnblogs.com/wchjdnh/p/10760139.html

时间: 2024-10-28 21:59:21

学习源码第四天(昨天只看了一点正则,发现正则真的水很深,但很有魅力)的相关文章

Duilib 学习源码系列1-创建控件

好了,昨天研究出了为什么加载xml结束以后我在自己新建一个控件位置不能调整,原来要先add才能调属性. 本来这个是昨天的任务,虽然这块内容是前天就看完的,权当边写边复习吧. 上一篇提到 <VerticalLayout name="window" bkcolor="#FFFFFFFF" bkcolor2="#FFAAAAA0" bkcolor3="#00000000"> 代表了一个控件字符串; 上次忘记说了 及时经过

mybatis源码分析(四) mybatis与spring事务管理分析

mybatis源码分析(四) mybatis与spring事务管理分析 一丶从jdbc的角度理解什么是事务 从mysql获取一个连接之后, 默认是自动提交, 即执行完sql之后, 就会提交事务. 这种事务的范围是一条sql语句. 将该连接设置非自动提交, 可以执行多条sql语句, 然后由程序决定是提交事务, 还是回滚事务. 这也是我们常说的事务. Connection connection = dataSource.getConnection(); // connection.setTransa

Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的? ??如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一样,本篇文章最最核心的要点就是 SqlSession实现数据库操作的源码解析.但按照惯例,我这边依然列出如下的问题: 1. SqlSession 是如何被创建的? 每次的数据库操作都会创建一个新的SqlSession么?(也许有很多同学会说SqlSession是通过 SqlSessionFactor

MINA2 源码学习--源码结构梳理

一.mina的整体框架结构及案例: 1.整体结构图: 简述:以上是一张来自网上比较经典的图,整体上揭示了mina的结构,其中IoService包含客户端IoConnector和服务端IoAcceptor两部分.即无论是客户端还是服务端都是这个结构.IoService封装了网络传输层(TCP和UDP),而IoFilterChain中mina自带的filter做了一些基本的操作之外,支持扩展.经过FilterChain之后最终调用IoHandler,IoHandler是具体实现业务逻辑的处理接口,具

Nouveau源码分析(四):NVIDIA设备初始化之nouveau_drm_load (1)

Nouveau源码分析(四) probe函数成功返回之后,DRM模块就会调用struct drm_driver的load函数,对应nouveau的nouveau_drm_load. 这个函数虽然看起来不是特别长,但每一个调用的函数展开后就会变得非常长了! // /drivers/gpu/drm/nouveau/nouveau_drm.c 364 static int 365 nouveau_drm_load(struct drm_device *dev, unsigned long flags)

boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)

* Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protocol来确定一些细节. Protocol的约束摘要如下: 1 class protocol 2 { 3 public: 4 /// Obtain an identifier for the type of the protocol. 5 int type() const; 6 7 /// Obtain

Spring 源码解析之ViewResolver源码解析(四)

Spring 源码解析之ViewResolver源码解析(四) 1 ViewResolver类功能解析 1.1 ViewResolver Interface to be implemented by objects that can resolve views by name. View state doesn't change during the running of the application, so implementations are free to cache views. I

39 网络相关函数(七)——live555源码阅读(四)网络

39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom 函数 函数原型: 参数说明: 返回说明: 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 简介 网络相关函数是一系列用于操作网络数据的函数.在多个文件中都有相关的函数的定义.

29 GroupSock(NetAddressList)——live555源码阅读(四)网络

29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 NetAddressList的定义 assign方法 NetAddressList的构造 clean方法与析构 拷贝构造与赋值运算符重载 NetAddressList::Iterator迭代器 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎