最近在看zepto的源代码,把一些有用的函数摘出来,看看zepto是怎么实现的,自己做的时候也可以用。说实话,zepto的实现有一些看起来还是很晦涩的,可能是自己的水平不够,看不透作者的真正的意图。

1、zepto的正则总结:

//HTML代码片断的正则fragmentRE = /^\s*<(\w+|!)[^>]*>/
//匹配非单独一个闭合标签的标签,类似将<div></div>写成了<div/>tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig
//根节点rootNodeRE = /^(?:body|html)$/i
//class选择器的正则classSelectorRE = /^\.([\w-]+)$/,//id选择器的正则idSelectorRE = /^#([\w-]*)$/,
//DOM标签正则tagSelectorRE = /^[\w-]+$/,

2、zepto工具函数总结(我的意思只是我感觉比较有用的哈):

 

 //判断一个元素是否匹配给定的选择器
//这里作者的实现我觉得有点小问题,其思想是在其父元素中按照selecor找出匹配的元素再indexOf判断是否存在,但是,如果selector是这样的呢“body div .a”,在其父元素中能匹配到body吗?我觉得还不如直接在document下匹配,欢迎拍砖。可能是我笨吧,或者zepto的qsa函数比较高级。zepto.matches = function(element, selector) {if (!element || element.nodeType !== 1) return false//引用浏览器提供的MatchesSelector方法var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.matchesSelectorif (matchesSelector) return matchesSelector.call(element, selector);//如果浏览器不支持MatchesSelector方法,则将节点放入一个临时div节点,//再通过selector来查找这个div下的节点集,再判断给定的element是否在节点集中,如果在,则返回一个非零(即非false)的数字// fall back to performing a selector:var match, parent = element.parentNode,temp = !parent//当element没有父节点,那么将其插入到一个临时的div里面if (temp)(parent = tempParent).appendChild(element)//将parent作为上下文,来查找selector的匹配结果,并获取element在结果集的索引,不存在时为-1,再通过~-1转成0,存在时返回一个非零的值match = ~zepto.qsa(parent, selector).indexOf(element)//将插入的节点删掉temp && tempParent.removeChild(element)return match}

  接下来就有个大问题了,是zepto的类型判断部分,求解答:

//问题在这里,下面的type函数中,很明显有问题啊,class2type[toString.call(obj)]我感觉不对啊,我感觉应该是toString.call(obj).slice(8,-1);待我去知乎上问下,再分享给大家。//好吧,我承认自己太急躁了原来还有下面这么一段,
  $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
  class2type[ "[object " + name + "]" ] = name.toLowerCase()
  })
var class2type={},toString=class2type.toString;
function type(obj) {//obj为null或者undefined时,直接返回'null'或'undefined'return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"}function isFunction(value) {return type(value) == "function"}function isWindow(obj) {return obj != null && obj == obj.window}function isDocument(obj) {return obj != null && obj.nodeType == obj.DOCUMENT_NODE}function isObject(obj) {return type(obj) == "object"}//对于通过字面量定义的对象和new Object的对象返回true,new Object时传参数的返回false//可参考http://snandy.iteye.com/blog/663245function isPlainObject(obj) {return isObject(obj) && !isWindow(obj) && obj.__proto__ == Object.prototype}function isArray(value) {return value instanceof Array}//类数组,比如nodeList,这个只是做最简单的判断,如果给一个对象定义一个值为数据的length属性,它同样会返回truefunction likeArray(obj) {return typeof obj.length == 'number'}

 3、数组操作

//清除给定的参数中的null或undefined,注意0==null,'' == null为false
//这个很赞,用filterfunction compact(array) {return filter.call(array, function(item) {return item != null})}//类似得到一个数组的副本,拷贝数组a就return a.concat([]);很赞function flatten(array) {return array.length > 0 ? $.fn.concat.apply([], array) : array}

//数组去重,如果该条数据在数组中的位置与循环的索引值不相同,则说明数组中有与其相同的值

//数组去重的方法有很多,但作者的这个方法真心赞,让我折服了,即短又高效!
uniq = function(array) {
return filter.call(array, function(item, idx) {
return array.indexOf(item) == idx
})
}

 4、字符串操作

//将字符串转成驼峰式的格式camelize = function(str) {return str.replace(/-+(.)?/g, function(match, chr) {return chr ? chr.toUpperCase() : ''})}//将字符串格式化成-拼接的形式,一般用在样式属性上,比如border-width//这个写的太赞了,真的是每一句都很赞,由衷的佩服。function dasherize(str) {return str.replace(/::/g, '/') //将::替换成/.replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') //在大小写字符之间插入_,大写在前,比如AAAbb,得到AA_Abb.replace(/([a-z\d])([A-Z])/g, '$1_$2') //在大小写字符之间插入_,小写或数字在前,比如bbbAaa,得到bbb_Aaa.replace(/_/g, '-') //将_替换成-.toLowerCase() //转成小写}

  

转载于:https://www.cnblogs.com/dunken/p/4396623.html

zepto学习之路--源代码提取相关推荐

  1. 对QT学习之路12-14的源代码补充与修正

    QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...

  2. pyqt5从子目录加载qrc文件_【JVM系统学习之路】一篇看懂类加载

    JVM系统学习之路系列演示代码地址:https://github.com/mtcarpenter/JavaTutorial 嗨喽,小伙伴大家好,我是小春哥,今天是打卡 [JVM系统学习之路] 的第二篇 ...

  3. 我的Python学习之路(一)_Mr_Ouyang

    我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...

  4. 个人开发经历--我的java学习之路(学校篇)

    个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...

  5. mavlink协议_MAVLink学习之路05_MAVLink应用编程接口分析

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 一.写在前面 前面写的几篇文章你掌握了,说明你离成功很近了 ...

  6. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  7. AI 学习之路——轻松初探 Python 篇(一)

    喜欢小之的文章的可以关注公众号「WeaponZhi」持续关注动态 这是「AI 学习之路」的第 1 篇,「Python 学习」的第 1 篇 前言 1. Python 篇的组织结构 不管是学习人工智能还是 ...

  8. F#学习之路(3) 如何组织程序(下)

    二.名称空间(namespace) 名称空间,将一组逻辑上相关的类型.模块放在一起,主要是为了解决名称冲突的问题,同时也便于更好的理解程序结构.F#的名称空间概念及定义与C#基本相似. 1.定义名称空 ...

  9. C/C++学习之路: 多态

    C/C++学习之路: 多态 目录 多态基本概念 向上类型转换及问题 如何实现动态绑定 抽象基类和纯虚函数 纯虚函数和多继承 虚析构函数 重写,重载,重定义 1. 多态基本概念 多态是面向对象程序设计语 ...

最新文章

  1. [树组BIT]训练两题重新理解ver.
  2. ubuntu16.04+cuda7.5
  3. node 大写_大写Node.js模块
  4. 1069. 微博转发抽奖(20)
  5. jitpack让使用第三方依赖库更简单
  6. 动态规划 —— 线性 DP —— 字符串编辑距离
  7. 太惨了!卖一个月不如小米卖一天,手机一哥仍不甘心
  8. -le: unary operator expected_【AFM+STM-LE】超经典:研究单分子化学反应引起的光发射ACS Nano...
  9. springboot集成shiro 前后端分离 统一处理shiro异常
  10. zabbix企业应用之固定端口监控memcache
  11. 美赛整理之遗传算法优化BP神经网络的齿轮故障诊断问题
  12. java中bin和src文件夹_编译src中的所有文件?
  13. 在GridView列中动态创建几个CheckBox
  14. 读《DOOM启示录》随想
  15. 基于深度学习的图像超分论文推荐
  16. python的spider如何让鼠标不_python wooyun爬虫模拟鼠标等
  17. 如何卸载AutoCAD 2019,彻底卸载MAC版CAD教程
  18. 利用css3伪元素实现加号、减号、对号小图标效果
  19. 整型常量是整数类型的数据
  20. win10 此电脑中【设备和驱动器】位置出现空白图标

热门文章

  1. python读取csv某些行_【Python】Python 读取csv的某行或某列数据
  2. 计算机网络ipv4到ipv6怎么实现,论计算机网络协议IPV4到IPV6的过渡策略|房屋搬迁过渡协议...
  3. python语言语块句的标记_NLTK基础教程学习笔记(十一)
  4. 强大的Canvas开源库Fabric.js简介与开发指南
  5. java api操作hbase_通过JavaAPI使用HBase
  6. mongodb java id 查询数据_java 用 _id 查找 MongoDB 下的数据
  7. docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群
  8. 【APICloud系列|19】上架APPStore需要准备哪些材料?
  9. 修改mysql 外删除用户_mysql添加用户、删除用户、授权、修改密码等
  10. matlab pca可视化,利用Matlab实现PCA demo展示