读zepto核心源码学习JS笔记(3)--zepto.init()

上篇已经讲解了zepto.init()的几种情况,这篇就继续记录这几种情况下的具体分析.

1. 首先是第一种情况,selector为空

既然是反向分析,那我们先看看这句话的代码;

if (!selector) return zepto.Z()

这里的返回值为zepto.Z();那我们继续往上找zepto.Z()函数

zepto.Z = function(dom, selector) {return new Z(dom, selector)
}

这个函数仍然拥有一个返回值,Z函数的实例,同样的道理,我们继续去找Z() ;

function Z(dom, selector) {var i, len = dom ? dom.length : 0for (i = 0; i < len; i++) this[i] = dom[i]this.length = lenthis.selector = selector || ''
}

根据以上代码可以分析出,当没有参数时,会得到一个length:0,selector:''的对象.
1044766-20170713172250197-1275291817.png

2. 当selector为字符串的时候,又分为三种情况;

同样的,我们先看看这句话的代码

else if (typeof selector == 'string') {selector = selector.trim()
}
  • 第一种,当selector为html片段
if (selector[0] == '<' && fragmentRE.test(selector))dom = zepto.fragment(selector, RegExp.$1, context), selector = null

这里有两个知识点:
1 fragmentRE.test(selector)

这里的fragmentRE是Zepto函数在之前定义的一段正则;
```java
//<div>erfwef</div>  取出<div>
fragmentRE = /^\s*<(\w+|!)[^>]*>/,
```

2 zepto.fragment(selector, RegExp.$1, context)
* RegExp.$1
RegExp.$1为RegExp的一个属性,指的是与正则表达式匹配的第一个 子匹配(以括号为标志)字符串;
例子:
java var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; r.exec('1985-10-15'); s1=RegExp.$1; s2=RegExp.$2; s3=RegExp.$3; alert(s1+" "+s2+" "+s3)//结果为1985 10 15
* zepto.fragment()函数

```java
//对应上面的代码,这里第一个参数是selector,就是我们在写代码时的$('xxx')中的xxx,name为RegExp.$1,即正则匹配的第一个()里的东西,就是标签元素,例如 div p  h1等,properties为执行环境.
zepto.fragment = function(html, name, properties) {var dom, nodes, container// singleTagRE仍为之前定义的变量,singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, 匹配值如下截图//如html传入值为<p></p>,匹配singleTagRE,则创建<p></p>,并调用$('<p></p>')if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))//如果不匹配if (!dom) {//这是一段修复代码,将<div/>之类的不正常的代码修复成<div></div>;具体的下面再讲解if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>")//如果没有标签名,,给他一个标签,fragmentRE = /^\s*<(\w+|!)[^>]*>/,if (name === undefined) name = fragmentRE.test(html) && RegExp.$1//containers = {tr': document.createElement('tbody'),tbody': table, 'thead': table, 'tfoot': table,td': tableRow, 'th': tableRow,'*': document.createElement('div')},//如果name值不在container范围内,则标签名为divif (!(name in containers)) name = '*'//创建容器container = containers[name]//把html片段放入到容器中container.innerHTML = '' + html//这里调用了$.each();一会再详细讲解,这里是涉及到哪个函数我就去解析哪个函数,虽然看起来比较乱,但是符合我自己的逻辑线路.//emptyArray = [], slice = emptyArray.slice,所以这里的slice.call即为Array.prototype.slice.call(),能将具有length属性的对象转成数组;dom = $.each(slice.call(container.childNodes), function(){//删除container.removeChild(this)})}if (isPlainObject(properties)) {nodes = $(dom)$.each(properties, function(key, value) {if (methodAttributes.indexOf(key) > -1) nodes[key](value)else nodes.attr(key, value)})}return dom

}
```

以上代码出现了singleTagRE

  • singleTagRE

1044766-20170713172311400-1100116137.png

  • tagExpanderRE

1044766-20170713172323197-1256822567.png

  • fragmentRE

1044766-20170713172335072-388797673.png

  • 第二种 当context有值
 else if (context !== undefined) return $(context).find(selector)

这里涉及到一个方法find,是$.fn中的方法,之后做统一分析;

  • 第三种 selector为普通选择器
 else dom = zepto.qsa(document, selector)
    zepto.qsa = function(element, selector){var found,//判断是不是IDmaybeID = selector[0] == '#',//判断是不是cssmaybeClass = !maybeID && selector[0] == '.',//看是不是class和id名,如果是,将'#'或者'.'去除,然后赋值给nameOnlt;//否则,直接将值赋值;nameOnly = maybeID || maybeClass ? selector.slice(1) : selector,//simpleSelectorRE = /^[\w-]*$/,//匹配字母数字下划线和减号的组合;isSimple = simpleSelectorRE.test(nameOnly)//如果有内置getElementById方法,并且是id名;return (element.getElementById && isSimple && maybeID) ?//则返回element.getElementByID(nameOnly)( (found = element.getElementById(nameOnly)) ? [found] : [] ) ://反之的话,再做一次判断//若element不为元素节点,document,DocumentFragment时;为空,(element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] ://否则,将节点转换成数组;slice.call(//这里是一个三元运算符里套着另一个三元运算符;isSimple && !maybeID && element.getElementsByClassName ?//当为class,则调用element.getElementsByClassName(nameOnly) maybeClass ? element.getElementsByClassName(nameOnly) ://否则调用tagName;element.getElementsByTagName(selector) ://这个否则是最外层的判断;element.querySelectorAll(selector))}

3. 当传入的值为函数时,则在dom加载后执行它;

else if (isFunction(selector)) return $(document).ready(selector)

4. 如果selector为Z的实例对象.则返回他自己;

else if (zepto.isZ(selector)) return selector

5. 最后,又分为5种情况;

  • 如果selector为数组;
    java // if (isArray(selector)) dom = compact(selector)
    这里用到了一个compact方法;
    java //这里调用了一个filter方法,是在$.fn内,以后统一分析; //这个函数是去除数组中的null和undefined; function compact(array) { return filter.call(array, function(item){ return item != null }) }
    所以当为数组的时候,去除数组中的null和undefined;

  • selector为对象
    java else if (isObject(selector)) dom = [selector], selector = null
    如果selector为对象,将对象变为一个数组;
  • selector为html片段;则将其转换成dom
    java else if (fragmentRE.test(selector)) dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
  • 有context的时候

    else if (context !== undefined) return $(context).find(selector)
  • 没有context
    java else dom = zepto.qsa(document, selector)

转载于:https://www.cnblogs.com/siva-epoch/p/7161627.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css flexbox模型_Flexbox和CSS Grid之间的主要区别

css flexbox模型by Shaira Williams由莎拉威廉姆斯(Shaira Williams) Flexbox和CSS Grid之间的主要区别 (The main differences between Flexbox and CSS Grid) Dimensions define the primary demarcation between Flexbox and CSS Grid. Flexbox was designed specifically …

置信区间估计 预测区间估计_估计,预测和预测

置信区间估计 预测区间估计Estimation implies finding the optimal parameter using historical data whereas prediction uses the data to compute the random value of the unseen data.估计意味着使用历史数据找到最佳参数&#xff0c;而预测则使用该数据来计算未见数据的…

鸿蒙系统还会推出吗,华为明年所有自研设备都升级鸿蒙系统,还会推出基于鸿蒙系统的新机...

不负期许&#xff0c;华为鸿蒙OS手机版如期而至。今日(12月15日)&#xff0c;鸿蒙OS 2.0手机开发者Beta版本正式上线&#xff0c;支持运行安卓应用&#xff0c;P40、Mate 30系列可申请公测。国内媒体报道称&#xff0c;华为消费者业务软件部副总裁杨海松表示&#xff0c;按照目…

C#中将DLL文件打包到EXE文件

1&#xff1a;在工程目录增加dll目录&#xff0c;然后将dll文件复制到此目录&#xff0c;例如&#xff1a; 2&#xff1a;增加引用&#xff0c;定位到工程的dll目录&#xff0c;选中要增加的dll文件 3&#xff1a;修改dll文件夹下面的dll文件属性 选中嵌入式资源&#xff0c;不…

PopupMenu控件的使用

1、用PopupMenu控件能进行右键菜单的实现&#xff0c;它的实现还需要绑定到barManager控件上&#xff0c;在barManager的Customize中添加右键所需要显示的功能。 2、PopupMenu属性栏中绑定Manager为barManager&#xff1b; 3、窗体加载事件中创建 this.popupMenu1.AddItems(new…

Java—动态代理

动态代理利用了JDK API&#xff0c;动态地在内存中构建代理对象&#xff0c;从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。 静态代理与动态代理的区别主要在&#xff1a; 静态代理在编译时就已经实现&#xff0c;编译完成后代理类是一个实际的class文件…

Oracle VM Virtual Box的安装

安装Oracle VM Virtual Box安装扩展插件 选择"管理""全局设定" 在设置对话框中&#xff0c;选择"扩展" 选择"添加包" 找到"Oracle_VM_VirtualBox_Extension_Pack-4.1.18-78361"&#xff0c;点击"打开" 5&#x…

python 移动平均线_Python中的SMA(短期移动平均线)

python 移动平均线With the evolution of technology rapidly evolving, so do strategies in the stock market. In this post, I’ll go over how I created a SMA(Short Moving Average) strategy.随着技术的飞速发展&#xff0c;股票市场的策略也在不断发展。 在本文中&…

angular中的href=unsafe:我该怎么摆脱你的溺爱!!

解决方法&#xff1a;angular.module加入下面这行&#xff1a;&#xff08;依据Angular changes urls to “unsafe:” in extension page&#xff09; .config(function($compileProvider){//注:有些版本的angularjs为$compileProvider.urlSanitizationWhitelist(/^\s*(https?…

android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测

如何在Android中利用 GestureDetector进行手势检测发布时间&#xff1a;2020-11-26 16:15:21来源&#xff1a;亿速云阅读&#xff1a;92作者&#xff1a;Leah今天就跟大家聊聊有关如何在Android中利用 GestureDetector进行手势检测&#xff0c;可能很多人都不太了解&#xff0c…

Ubuntu2204配置samba

0.前情说明 samba服务器主要是用来局域网共享文件的&#xff0c;如果想公网共享可能行不通&#xff0c;我已经踩坑一天了 所以说如果你想满足公网samba共享你就可以不要看下去了 1.参考连接 Ubuntu 安装 Samba 服务器_ubuntu安装samba服务器-CSDN博客 2.安装samba服务 sud…

Java—BIO模型

利用 BIO 模型&#xff08;传统阻塞 IO 模型&#xff09;实现多用户访问 源代码 Server类 public class server {public static void main(String[] args) {ExecutorService executorService Executors.newFixedThreadPool(6);try {ServerSocket serverSocketnew ServerSocke…

c++学编程如何锻炼耐力_我如何学习编程:这是一项耐力运动

c学编程如何锻炼耐力by Amy M Haddad通过艾米M哈达德(Amy M Haddad) 我如何学习编程&#xff1a;这是一项耐力运动 (How I’m learning to program: it’s an endurance sport) 为什么我的编程学习轨迹反映了我作为跑步者的训练方式 (Why my learning trajectory for programm…

python处理文本数据

处理文本数据&#xff0c;主要是通过Seris的str访问。遇到NaN时不做任何处理&#xff0c;保留结果为NaN&#xff0c;遇到数字全部处理为NaN。 str是Seris的方法&#xff0c;DataFrame不能直接使用&#xff0c;但是通过索引选择DataFrame中的某一行或者某一列&#xff0c;结果为…

Java系列笔记(4) - JVM监控与调优【转】

Java系列笔记(4) - JVM监控与调优【转】 目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例 光说不练假把式&#xff0c;学习Java GC机制的目的是为了实用&#xff0c;也就是为了在JVM出现问题时分析原因并解决之。通过学习&#xff0c;我觉得JVM监控与调…

Maven打包排除某个资源或者目录

最近在spark streaming本地调试的时候&#xff0c;引入了一些资源文件&#xff0c;打包的时候需要给排除掉。所以就考虑使用maven的方式 详细参考官方文档&#xff1a;https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html 排除某个资源文件 <…

android发送网络请求没反应,Android无法使用HttpURLConnection发送GET请求

我正在尝试在我的应用程序中使用HttpURLConnection.我将我的请求方法设置为’GET’,但是当我尝试检索输出流时,该方法将更改为’POST’&#xff01;我不确定是什么原因,但是当我使用’POST’发送请求时,我的JSON服务器(我使用JAX-RS)会返回一个空白页面.这是我的代码片段&#…

地图 c-suite_C-Suite的模型

地图 c-suiteWe’ve all seen a great picture capture an audience of stakeholders.我们所有人都看到了吸引利益相关者听众的美好画面。 Let’s just all notice that the lady in the front right is not captivated by the image on the board (Photo by Christina wocin…

框架和库的区别_框架和库之间的区别

框架和库的区别Developers often use the terms “library” and “framework” interchangeably. But there is a difference.开发人员经常互换使用术语“库”和“框架”。 但是有区别。 Both frameworks and libraries are code written by someone else that is used to he…

Java—多线程实现生产者消费者模型

采用线程实现“生产者-消费者”编程的基础模型 源代码 消费者代码&#xff1a; public class Consumer implements Runnable {BlockingQueue<Integer> blockingQueue;int n;CountDownLatch countDownLatch;public Consumer(BlockingQueue<Integer> blockingQueue…