前言

昨天学习了核心$(),有几个遗留问题,我们今天来看看吧

$.each

遍历数组/对象,将每条数据作为callback的上下文,并传入数据以及数据的索引进行处理,
如果其中一条数据的处理结果明确返回false,则停止遍历,并返回elements

 $.each = function (elements, callback) {
var i, key
if (likeArray(elements)) {
for (i = 0; i < elements.length; i++) {
if (callback.call(elements[i], i, elements[i]) === false)
return elements;
}
} else {
for (key in elements) {
if (callback.call(elements[key], key, elements[key]) === false)
return elements;
}
}
return elements
}

这个方法本身实现比较简单,我们就不追究了,我们看看里面用到了一个likeArray

 function likeArray(obj) {
return typeof obj.length == 'number'
}

这个方法我们就说完了,下面会用到的所以这里就先提出来

zepto.fragment

首先,他的调用时这个样子的:

dom = zepto.fragment(selector.trim(), RegExp.$1, context)

传入html字符串,第二个参数为寻找到的name,第三个是上下文,我们先来看看这个正则

var fragmentRE = /^\s*<(\w+|!)[^>]*>/;

我们来随便写一段代码测试下

 //HTML代码片断的正则
var fragmentRE = /^\s*<(\w+|!)[^>]*>/;
var str = '<div><span>fdfdsdf</span></div>';
console.log(RegExp.$1);
console.log(fragmentRE.test(str));
console.log(RegExp.$1);
console.log(fragmentRE.exec(str));

这段代码的结果如下,RegExp.$1应该是取得最近一次匹配的标签
所以这里传入的参数就是字符串和最外层标签名了,我们继续往下走

然后他这里来了一个html修复,向只写了<div>没结尾的会补全

 var tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig;
var str = '<p class="ddd"/>';
console.log(tagExpanderRE.exec(str));
console.log(str.replace(tagExpanderRE, "<$1></$2>"));

因为下面要用到name,而如果没有传入name参数,name就会被指定相关值,设值方式与上面一致

 if (name === undefined) name = fragmentRE.test(html) && RegExp.$1

现在设值容器标签名,因为table情况有所不同所以这里单独对table做了处理,其它的容器都是div

 var table = document.createElement('table');
var tableRow = document.createElement('tr');
var containers = {
'tr': document.createElement('tbody'),
'tbody': table,
'thead': table,
'tfoot': table,
'td': tableRow,
'th': tableRow,
'*': document.createElement('div')
};
var container.innerHTML = '' + html //将html代码片断放入容器

然后依次取出容器中的dom结构,这里用到了each方法,我们上面已经说明了
这个方法反正就是将dom中的所有children删除了,然后返回

 var table = document.createElement('table');
var tableRow = document.createElement('tr');
var containers = {
'tr': document.createElement('tbody'),
'tbody': table,
'thead': table,
'tfoot': table,
'td': tableRow,
'th': tableRow,
'*': document.createElement('div')
}; function likeArray(obj) {
return typeof obj.length == 'number'
}
var $ = {};
var slice = [].slice;
//slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
//var str = "Hello happy world!"
//document.write(str.slice(6, 11)); //happy $.each = function (elements, callback) {
var i, key
if (likeArray(elements)) {
for (i = 0; i < elements.length; i++) {
if (callback.call(elements[i], i, elements[i]) === false)
return elements;
}
} else {
for (key in elements) {
if (callback.call(elements[key], key, elements[key]) === false)
return elements;
}
}
return elements
}
var name = '*', html = '<div><span></spam></div>';
var container = containers[name];
container.innerHTML = html; var dom = $.each(slice.call(container.childNodes), function () {
container.removeChild(this);
})
console.log(container);
console.log(dom);

这里只清空container,我们的dom还是在的,并真资格的编程了dom数组了

这里dom其实基本搞完了,完了可以对属性进行设置,其中就用到了zepto属性设置的方法了,我们这里暂时不管他

 if (isPlainObject(properties)) {
nodes = $(dom) //将dom转成zepto对象,为了方便下面调用zepto上的方法
//遍历对象,设置属性
$.each(properties, function (key, value) {
//如果设置的是'val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset',则调用zepto上相对应的方法
if (methodAttributes.indexOf(key) > -1) nodes[key](value)
else nodes.attr(key, value)
})
}

最后返回了我们创建好的dom数组,所以我们就可以使用zepto.Z将之封装了

这个完了,我们来看看我们的zepto.qsa

zepto.qsa

这个方法用作选择器,这个直接调用的html5 javascript选择元素的方法

 zepto.qsa = function (element, selector) {
var found
//当element为document,且selector为ID选择器时
return (isDocument(element) && idSelectorRE.test(selector)) ?
//直接返回document.getElementById,RegExp.$1为ID的值,当没有找节点时返回[]
((found = element.getElementById(RegExp.$1)) ? [found] : []) :
//当element不为元素节点或者document时,返回[]
(element.nodeType !== 1 && element.nodeType !== 9) ? [] :
//否则将获取到的结果转成数组并返回
slice.call(
//如果selector是标签名,直接调用getElementsByClassName
classSelectorRE.test(selector) ? element.getElementsByClassName(RegExp.$1) :
//如果selector是标签名,直接调用getElementsByTagName
tagSelectorRE.test(selector) ? element.getElementsByTagName(selector) :
//否则调用querySelectorAll
element.querySelectorAll(selector))
}

这个方法我最后发现比较简单,就是选择器,我们这里就不管他了

结语

我们今天暂时到这,下次再继续

【zepto学习笔记01】核心方法$()(补)的更多相关文章

  1. 【zepto学习笔记01】核心方法$()

    前言 我们移动端基本使用zepto了,而我也从一个小白变成稍微靠谱一点的前端了,最近居然经常要改到zepto源码但是,我对zepto不太熟悉,其实前端水准还是不够,所以便私下偷偷学习下吧,别被发现了 ...

  2. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  3. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  4. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  5. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...

  6. PHP 学习笔记 01

    例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...

  7. vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍

    这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...

  8. [Golang学习笔记] 01 工作区和GOPATH

    Go语言3个环境变量: GOROOT:GO语言按照根路径,也就是GO语言的安装路径. GOPATH:若干工作区目录的路径.是我自己定义的工作空间. GOBIN:GO程序生成的可执行文件(executa ...

  9. xml基础学习笔记01

    注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...

随机推荐

  1. CSS弹性盒模型flex在布局中的应用

    × 目录 [1]元素居中 [2]两端对齐 [3]底端对齐[4]输入框按钮[5]等分布局[6]自适应布局[7]悬挂布局[8]全屏布局 前面的话 前面已经详细介绍过flex弹性盒模型的基本语法和兼容写法, ...

  2. HTML5第二节

    第二回合:HTML5的新特性 与之前的HTML4.01相比,HTML5增加了非常多的改变: ① 新的语义元素:<article>.<aside>.<figure>. ...

  3. [Node.js] 对称加密、公钥加密和RSA

    原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可 ...

  4. Shine.js – 帮助你实现各种好看的阴影效果

    Shine.js 是一个用于实现漂亮阴影的 JavaScript 库.您可以设置动态光的位置,可定制的阴影.不依赖于第三方库,兼容 AMD.能在支持 textShadow 或 boxShadow 的浏 ...

  5. ASP.NET 文件下载

    using System; using System.Web; using System.IO; public partial class _Default : System.Web.UI.Page ...

  6. Httpd运维日志:通过apxs添加模块

    Brief 在部署Httpd时为方便管理和安全等原因,我们仅会安装所需的模块,那么后期功能扩展时则需要通过Httpd内置提供的apxs程序来进行模块添加. 而apxs程序则位于apache/bin目录 ...

  7. 让我们开启数据库无Linq、零sql时代

    让我们开启数据库无Linq.零sql时代 Moon.Orm 5.0总论 第一部分 MQL Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布)  Moon.Orm 5.0系列文章 1. ...

  8. 六、GAIA

    1.      GAIA CSR GAIA (Generic Application Interface Architecture)提供了一个端到端的,与主机无关的生态系统来实现主机应用程序对设备的功 ...

  9. SqlCommandBuilder实现大数据更新

    /// <param name="table">准备更新的DataTable新数据</param> /// <param name="Tab ...

  10. 【转载】Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...