主要介绍一下wrap, wrapAll, wrapInner, unwrap方法。

wrapAll

在所有匹配元素外面包一个单独的结构。结构可以是单个元素或 几个嵌套的元素,并且可以是html字符串或者dom元素。

用文字解释一下,就是先把传入的参数转换为dom结构,插入到所选择的包装集的前面,然后将包装集插入到所插入的dom元素的最深层次的第一个子集里面。

逐行解释:

structure = $(structure)是将传入的参数转换为dom元素,再使用before方法插入到所选择的包装集的第一个元素的前面。

这里的this[0]相当于$(selector).get(0)

children = structure.children()就是获取插入的dom结构的子集,利用while循环,判断children是否存在,直到最内存的children,取得第一个dom元素,并赋值给structure。

将所选取的包装集直接插入到$(structure)。

返回$(this),确保可以链式调用。

wrap

在每个匹配的元素外层包上一个html元素。参数与wrapAll类似,但是比wrapAll多一种类型,wrap的参数可以为函数类型,通过回调函数返回前面的包裹片段。

如果包装集不为空,并且传入的参数不是函数类型,定义两个变量,举例:如果参数为‘<div class="test1"></div><div class="test2"></div>’,则dom的值为'<div class="test1"></div>',自动忽略后面的。

clone = dom.parentNode || this.length > 1

由于包装集不一定仅有一个元素,如果超过一个元素的话,要实现每一个包装集元素进行包裹的话,就需要对dom进行克隆,而且属于深拷贝。根据当前选择的包装集是否大于1来判断是否需要深拷贝。不理解dom.parentNode的作用是什么,dom是传入的参数所转化的dom结构,怎么会有parentNode?

准备工作完成之后,需要对所选取的包装集遍历,逐个使用wrapAll进行包装。

wrapAll里面的参数,需要依据条件进行判断,如果wrap参数是函数的话,则将执行函数,返回结果作为wrapAll的参数,如果不是函数,就一句clone的值,来判断是不是需要多次使用,如果包装集只有一个元素,则直接将dom传入,如果有多个元素,则将dom深拷贝。

这里需要对三元运算符有一定的理解,能够更容易理解这段。

wrapInner

将每个元素中的内容包裹在一个单独的结构中。

可以参照wrap进行理解,区别在于是将wrap需要包裹的元素本身,替换成wrapInner需要包裹其子集,关键点在于contents = self.contents(),然后如果该元素没有子集,则直接将所传入的参数转换的dom结构插入到该元素之内(self.append(dom))

unwrap

移除集合中每个元素的直接父节点,并把他们的子元素保留在原来的位置。

目标是移除所有父节点,所以先获取当前包装集的父元素,并进行遍历,对遍历的项利用其子集直接替换replaceWith($(this).children()),这里需要理解的是this,一共有四个this,但是this的指向并不相同,this.parent和 return this中的this,指的是包装集,而两个$(this)中的this指的是获取到的parents进行遍历的每一个parent项。

深入理解this即可。

zepto源码--核心方法4(包装)--学习笔记的更多相关文章

  1. zepto源码--核心方法10(位置)--学习笔记

    今天基本上就是zepto学习笔记的最后一篇了,介绍一下有关位置的函数,position, offset, scrollLeft, scrollTop scrollLeft 如果所选取的包装集不存在,则 ...

  2. zepto源码--核心方法(类数组相关)--学习笔记

    从这篇起,在没有介绍到各类插件之前,后面将陆续介绍zepto对外暴露的核心方法.即$.fn={}里面的所有方法的介绍.会配合zepto的API进行介绍. 其实前面已经介绍了几个,如width,heig ...

  3. zepto源码--几个判断函数--学习笔记

    几个需要经常用到的类型判断: 自定义一个类似于typeof的函数,提供更多的类型判断. class2type[toString.call(obj)] 是对class2type的取值 在后面通过循环对c ...

  4. zepto源码--核心方法9(管理包装集)--学习笔记

    今天介绍的是与子元素相关的函数,children, find, contents children 从源码来看,主要是调用过滤函数filtered对遍历整个包装集返回的children进行过滤. 仔细 ...

  5. zepto源码--核心方法7(管理包装集)--学习笔记

    后面应该会有几篇连续介绍关于zepto包装集的文章.涉及的函数较多,就分别介绍,今天介绍几个使用关系获取包装集的方法.prev, next, first, last, siblings, eq pre ...

  6. zepto源码--核心方法8(管理包装集)--学习笔记

    继续包装集过滤的相关函数的介绍,今天介绍与父元素相关的函数,parent, parents, closest, offsetParent parent 获取对象集合中每个元素的直接父元素. 与上篇文章 ...

  7. zepto源码--核心方法5(文本操作)--学习笔记

    涉及到文本内容的主要有三个函数:html, text, val. 我们已经见过多次,一个函数多种用途的情况,今天这三个函数也不例外,既可以获取内容,也可以设置内容.判断条件就是有没有传入参数,如果没有 ...

  8. zepto源码--核心方法3(属性相关)--学习笔记

    继续$.fn方法 今天主要介绍几个跟属性操作相关的方法attr, removeAttr, prop, data attr 读取或设置dom的属性.如果没有给定value参数,则读取对象集合中第一个元素 ...

  9. zepto源码--核心方法6(显示隐藏)--学习笔记

    在不引入zepto插件模块fx_metho其他ds的情况下,zepto默认的显示隐藏的函数只有show, hide, toggle,这里解释有个前提条件,就是没有引入zepto的fx_methods插 ...

随机推荐

  1. The 2015 China Collegiate Programming Contest E. Ba Gua Zhen hdu 5544

    Ba Gua Zhen Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  2. 【原】iOS学习之第三方-AFNetworking1.3.0

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方 ...

  3. BZOJ4631 : 踩气球

    将所有盒子插入链表,每当一个盒子变空时,从链表里删去它. 查一下它的前驱后继$pre,nxt$,那么$[pre+1,nxt-1]$都是空的. 每次对于$[A,B]$这段都为空,对小朋友按$R$维护线段 ...

  4. BZOJ4231 : 回忆树

    一个长度为$|S|$的串在树上匹配有两种情况: 1.在LCA处转弯,那么这种情况只有$O(|S|)$次,暴力提取出长度为$2|S|$的链进行KMP即可. 2.不转弯,那么可以拆成两个到根路径的询问. ...

  5. 争夺 & KM思想

    题意: 给一张二分图,每个点与两个特定点又一条边相连,边权非负,让你给这个二分图每个点一个顶标,让每一条边两端顶标和大于等于这条边.求出最小顶标和. 这当然是翻译过的题目... 原题: 小Y和小P无聊 ...

  6. ACM 图像有用区域

    图像有用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 “ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以 ...

  7. HDU-1466 计算直线的交点数 经典dp

    1.HDU-1466   计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...

  8. RSA_RSA算法原理(二)

    上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解RSA算法.假设爱丽丝要与鲍勃进行加密通信,她该怎 ...

  9. JS代码判断字符串中有多少汉字【转】

    $("form").submit(function () { 2 var content = editor.getContentTxt(); 3 var sum = 0; 4 re ...

  10. 在配置IIS负载均衡时,引起的一系列问题

    问题一: IIS中要上传文件的路径是另一台服务器的地址(如:本机IP是192.168.0.100,文件保存的路径在://192.168.0.101/images/folder),在上传时抛出异常: A ...