pluck:

/**
* 根据是否存在此属性来获取当前集合,返回一组属性值
* @param property
* @returns {*}
*/
pluck: function(property){
return $.map(this, function(el){ return el[property] })
},

获取zepto对象的父节点时用到

filtered:

/**
* 过滤,返回处理结果为true的记录
* @param selector
* @returns {*}
*/
filter: function(selector){
    /*
      if(!selector) return this;
    */
//this.not(selector)取到需要排除的集合,第二次再取反(这个时候this.not的参数就是一个集合了),得到想要的集合
if (isFunction(selector)) return this.not(this.not(selector)) //filter收集返回结果为true的记录
return $(filter.call(this, function(element){
//当element与selector匹配,则收集
return zepto.matches(element, selector)
}))
}, /**
* 在元素集中过滤某些元素
* @param nodes
* @param selector
* @returns {*|HTMLElement}
*/
function filtered(nodes, selector) {
return selector == null ? $(nodes) : $(nodes).filter(selector)
}

parent:

   /**
* 获取父元素
* @param selector
* @returns {*|HTMLElement}
*/
parent: function(selector){
return filtered(uniq(this.pluck('parentNode')), selector)
}

 

$.map:

/**
* 内部方法
* 遍历对象/数组 在每个元素上执行回调,将回调的返回值放入一个新的数组返回
* @param elements
* @param callback
* @returns {*}
*/
$.map = function(elements, callback){
var value, values = [], i, key
//如果被遍历的数据是数组或者Zepto(伪数组)
if (likeArray(elements))
for (i = 0; i < elements.length; i++) {
value = callback(elements[i], i)
     // 
if (value != null) values.push(value)
}
else
//如果是对象
for (key in elements) {
value = callback(elements[key], key)
if (value != null) values.push(value)
}
return flatten(values)
}

parents:

/**
* 取得所有匹配的祖先元素
* @param selector
* @returns {*}
*/
parents: function(selector){
var ancestors = [], nodes = this //先取得所有祖先元素
while (nodes.length > 0) //到不再有父元素时,退出循环
//取得所有父元素 //nodes被再赋值为收集到的父元素数组
nodes = $.map(nodes, function(node){
//获取父级, isDocument(node) 到Document为止
// ancestors.indexOf(node)去重复
if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {
ancestors.push(node)
//收集已经获取到的父级元素,用于去重复
return node
}
}) //筛选出符合selector的祖先元素
return filtered(ancestors, selector)
},

这里的$.map还有过滤功能,callback若返回null或undefined,则映射值不会写入nodes数组中。这里的parents的调用者只能是单个dom的zepto集合,先是遍历将所有parentNode获取,然后根据selector调用filtered,选出满足条件的父节点。

children:

/**
* 获取元素的子节集
* 原理:原生方法children 老的火狐不支持的,遍历childNodes
* @param element
* @returns {*}
*/
function children(element) {
return 'children' in element ?
slice.call(element.children) :
$.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })
} /**
* 获取子元素集
* @param selector
* @returns {*|HTMLElement}
*/
children: function(selector){
return filtered(this.map(function(){ return children(this) }), selector)
},

这里主要使用到了element.childNodes获取子节点,并用node.nodeType来剔除不等于1的

siblings:

/**
* 获取兄弟节点集
* @param selector
* @returns {*|HTMLElement}
*/
siblings: function(selector){
return filtered(this.map(function(i, el){
//到其父元素取得所有子节点,再排除本身
return filter.call(children(el.parentNode), function(child){ return child!==el })
}), selector)
},

pre ,next:

  /**
* 筛选前面所有的兄弟元素
* @param selector
* @returns {*}
*/
prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') }, /**
* 筛选后面所有的兄弟元素
* @param selector
* @returns {*}
*/
next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },

zepto源码研究 - zepto.js-3 (常用的工具)的更多相关文章

  1. zepto源码研究 - zepto.js - 1

    简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...

  2. zepto源码研究 - deferred.js(jquery-deferred.js)

    简要:zepto的deferred.js 并不遵守promise/A+ 规范,而在jquery v3.0.0中的defer在一定程度上实现了promise/A+ ,因此本文主要研究jquery v3. ...

  3. zepto源码研究 - fx_methods.js

    简要:依赖fx.js,主要是针对show,hide,fadeIn,fadeOut的封装. 源码如下: // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zept ...

  4. zepto源码研究 - fx.js

    简要:zepto 提供了一个基础方法animate来方便我们运用css动画.主要针对transform,animate以及普通属性(例如left,right,height,width等等)的trans ...

  5. zepto源码研究 - zepto.js (zepto.init)

    简要:当我们用$()时,便会直接调用zepto.init 生成zepto对象,那zepto.init是如何根据不同类型的参数来生产指定对象呢? zepto.init = function(select ...

  6. zepto源码研究 - zepto.js - 6(模板方法)

    width  height  模板方法   读写width/height ['width', 'height'].forEach(function(dimension){ //将width,hegih ...

  7. zepto源码研究 - ajax.js($.ajax具体流程分析)

    简要:$.ajax是zepto发送请求的核心方法,$.get,$.post,$.jsonp都是封装了$.ajax方法.$.ajax将jsonp与异步请求的代码格式统一起来,内部主要是先处理url,数据 ...

  8. zepto源码研究 - ajax.js($.ajaxJSONP 的分析)

    简要:jsonp是一种服务器和客户端信息传递方式,一般是利用script元素赋值src来发起请求.一般凡是带有src属性的元素发起的请求都是可以跨域的. 那么jsonp是如何获取服务器的数据的呢? j ...

  9. zepto源码研究 - zepto.js - 5(dom属性管理)

    index: $.fn = {...... indexOf: emptyArray.indexOf,} index: function(element){ //这里的$(element)[0]是为了将 ...

  10. zepto源码研究 - zepto.js-4(常用的工具)

    $.each: /** * 以集合每一个元素作为上下文,来执行回调函数 * @param elements * @param callback * @returns {*} */ $.each = f ...

随机推荐

  1. Linux_hadoop_install

    1. Build Linux env my env is VM RedHat Linux 6.5 64bit    set fixed IP                  vim /etc/sys ...

  2. Forms & HTML 组件 - laravelcollective/html

    简书链接 :Forms & HTML 组件 - laravelcollective/html 安装 方法一: composer require laravelcollective/html 方 ...

  3. tomcat jar包加载顺序

    加载顺序: 1. $java_home/lib 目录下的java核心api 2. $java_home/lib/ext 目录下的java扩展jar包 3. java -classpath/-Djava ...

  4. django + nginx + raspberypi + pidaro

        对于一个从事后台开发的人来说,搞了个网站,我自己都觉得有点意外.不是很懂html,不是很懂css,不是很懂js,不是很懂web开发模式/框架,不是很懂httpd/nginx--,web的东西样 ...

  5. hdu How many integers can you find

    题意:找出小于n是m个数每个数的倍数的数的个数. 思路:用二进制表示是那几个数的倍数. 二进制进行容斥,去掉小于0的数. #include <cstdio> #include <cs ...

  6. ehci符合USB2.0,uhci,ohci,

    uhci   ohci   ehci他们都是主机控制器的规格,OHCI主要为非PC系统上以及带有SiShe ALi芯片组的 PC主板上的USB芯片,UHCI大多为Intel和Via主板上的USB控制器 ...

  7. 用Visual Studio创建集成了gtest的命令行工程

    gtest代码库中的sample代码 在gtest的代码库中,包含了10个sample的代码,覆盖了gtest的常见用法,sample的代码位于以下文件夹: gtest\samples 由于gtest ...

  8. linux系统资源信息监控

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  9. 微博广告推荐中有关Hadoop的那些事

    一.背景 微博,一个DAU上亿.每日发博量几千万的社交性产品,拥有庞大的数据集.如何高效得从如此规模的数据集中挖掘出有价值的信息,以增强用户粘性,提高信息传播速度,就成了重中之重.因此,我们引入了ha ...

  10. 经典C面试题

    12个有趣的C语言面试题 面试题C 摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出以下代码里的问题: #include< ...