主要介绍一下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. Backbone.js学习之一

    昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以 ...

  2. iOS系统架构

    1.iOS系统架构 iOS的系统架构分为四个层次 核心操作系统层 (Core OS) 它包括 内存管理 , 文件系统 , 电源管理以及一些其他的操作系统任务, 它可以直接和硬件设备进行交互 核心服务层 ...

  3. [转] linux 下查看一个进程运行路径的方法

    http://blog.csdn.net/brioxu/article/details/5104736 在linux下查看进程大家都会想到用 ps -ef|grep XXX ps -aux | hea ...

  4. Android -- TextView (3)

    1.效果图

  5. Install the Maven in your computer

    While, this blog will talk about installing the Maven in your computer. There are three steps as fol ...

  6. js-小效果-无缝滚动

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  7. Winform 窗体最小化隐藏在桌面右下角:转

    ICO文件要放到 bin\Debug 下 1.给主窗体添加 NotifyIcon 控件 2.窗体加载事件里 private void MainF_Load(object sender, EventAr ...

  8. checkbox全选与反选

    用原生js跟jquery实现checkbox全选反选的一个例子 原生js: <!DOCTYPE html> <html lang="en"> <hea ...

  9. 【周年版】Cnblogs for Android

    前言 扒衣见君节刚过去但是炎热夏天还在继续: 自14年8月推出博客园Android客户端以来,断断续续发了十几个后续版本,期间出现过各种问题,由于接口等诸多因素,每个模块的功能都可能随着时间和博客园主 ...

  10. preventDefault()方法

    该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作). 例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调 ...