上次看zepto的init方法时,有一段属性设置的代码,先来看看其表现:

if (isPlainObject(properties)) {
nodes = $(dom)
$.each(properties, function(key, value) {
if (methodAttributes.indexOf(key) > -1) nodes[key](value)
else nodes.attr(key, value)
})
}

在分析这里的时候,一直很困惑,为什么实例化dom之后,对nodes进行属性设置会导致dom也有了属性设置的结果。回想了一下,在javascript中,对象是引用,而不是赋值,而dom不是zepto对象就是Dom对象,假如是zepto对象的话,那么nodes其实就是dom,因为在zepto的init方法中,传入参数是zepto对象的话则直接返回该对象。而如果是其他对象的话,则将其设置为数组的第一个元素返回该数组。

zepto.init = function(selector, context) {
var dom
...
else if (typeof selector == 'string') {
...
}
...
else if (zepto.isZ(selector)) return selector
else {
...
else if (isObject(selector))
dom = [selector], selector = null
....
}
// create a new Zepto collection from the nodes found
return zepto.Z(dom, selector)
}

那么dom = [selector],是不是相当于dom[0] = selector;也是一个引用呢?

实验结果也就是一个引用。

那么言归正传,我们接下来看$.each函数

$.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
}

该函数事实上并没有什么特别,对于传入的第一个参数为要迭代的数组或对象,第二个为回调函数,如果迭代过程中有一个元素或属性返回false,则返回传入的第一个参数,否则迭代完再返回第一个参数。

然后就是attr方法了。

attr: function(name, value){
var result
return (typeof name == 'string' && !(1 in arguments)) ?
(0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :
this.each(function(idx){
if (this.nodeType !== 1) return
if (isObject(name)) for (key in name) setAttribute(this, key, name[key])
else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))
})
},

该方法首先判断传入的第一个参数是否为一个字符串,并判断是否有第二个参数,然后根据条件返回读取属性的值。

如果传入的是其他情况,则调用each方法,注意,这里的each是$.fn.each,与上面的$.each不同。

 each: function(callback){
emptyArray.every.call(this, function(el, idx){
return callback.call(el, idx, el) !== false
})
return this
},

each方法传入一个回调函数,并调用数组的every方法对this(则zepto对象)进行迭代,并将对象的属性作为回调函数的上下文进行调用。

那么attr方法中,传入的回调函数,则是首先判断this的nodeType是否为1,nodeType可以参考这里nodeType。若是,则调用setAttribute方法直接将传入的key-value对象设置为属性,否则就通过一个funcArg函数来设置其属性name的值。

function funcArg(context, arg, idx, payload) {
return isFunction(arg) ? arg.call(context, idx, payload) : arg
}

zepto中的属性设置的更多相关文章

  1. table中bordercolor属性设置后最新ie浏览器或firefox中不显示边线,借助table的css来实现边线

    table中的bordercolor属性设置后在最新的ie或者firefox中均不显示边线,table的边线又是常用功能.只能使用css来实现了,更通用,更方便一些. css: ​.ctable{ b ...

  2. 微信小程序:给data中对象中的属性设置值与给data中的属性或对象或数组设置值的区别

    一.给data中的属性或对象或数组设置值,属性名不需要加引号 this.setData({ material: param, // 这里material为对象 } this.setData({   d ...

  3. Echarts中Option属性设置

    目录 一.title--标题组件 二.legend--图例组件 三.tooltip--提示框组件 四.grid--可用于调整图例在整个容器中的占位 五.xAxis--x 轴 六.yAxis-y 轴 七 ...

  4. iOS类中的属性设置背景色(统一)

    unsigned int count; objc_property_t *properties = class_copyPropertyList([self class], &count); ...

  5. WinForm------BarManager中各种属性设置

    1.offset:红色Tool距离左边Tool的偏移量

  6. ListView中分割线的设置

    1.在布局文件中ListView元素中通过属性设置 android:divider="#fffff" 分割线颜色 android:dividerHeight="1px&q ...

  7. [Android]ListView中分割线的设置

    1.在布局文件中ListView元素中通过属性设置 android:divider="#fffff"  分割线颜色 android:dividerHeight="1px& ...

  8. 浅谈Vue中计算属性computed的实现原理

    虽然目前的技术栈已由Vue转到了React,但从之前使用Vue开发的多个项目实际经历来看还是非常愉悦的,Vue文档清晰规范,api设计简洁高效,对前端开发人员友好,上手快,甚至个人认为在很多场景使用V ...

  9. 如何在低api中使用View的属性设置方法如setAlpha等

    ViewPagerTransforms 是一个自定义了各种翻转效果的开源库,其中的各种PageTransformer使用了view的很多属性设置方法如DepthPageTransformer中:? p ...

随机推荐

  1. U-Boot bootargs简析

    Linux内核启动时需要一些配置信息,如根文件系统的类型.flash分区情况.串口终端的编号.内存的使用情况等等,而由于U-Boot和Linux Kernel的镜像是独立的两个文件,所以只能两者约定好 ...

  2. _ZNote_Chrom_插件_Chrom运行Android软件_APK

    https://chrome.google.com/webstore/detail/arc-welder/emfinbmielocnlhgmfkkmkngdoccbadn?utm_source=chr ...

  3. 换PHP7后访问Apache虚拟站点Forbidden的问题解决

    Httpd.conf中,注释掉前2行,补上后2行 <Directory /> #AllowOverride none #Require all denied Order deny,allo ...

  4. <笔记>TP5的分页传递额外参数

    默认生成的分页只有page一个参数,若需要提供额外的参数才能访问分页(例如查询结果的分页,需要传入查询关键字的参数才能显示结果),则需要设置额外参数query

  5. Ubuntu英文变为中文

    Ubuntu英文变为中文 注:(我也是第一次变语言,写的有点乱,我把重点的用红字表示.)     1.点击这个软件更新.  2.只有点击了上面那一步,这里才会软件资源 Software Sources ...

  6. javascript中数组总结

    数组是所有高级语言都会有的东西,数组是JS中使用最多的类型之一,所以掌握JS中数组的用法相当有帮助: 由于JS是一门弱类型的语言,所以数组里面可以放各种不同的数据类型,比如 var a = [1993 ...

  7. QEMU KVM libvirt手册(2): monitor

    Administrating Virtual Machines with QEMU Monitor When QEMU is running, a monitor console is provide ...

  8. 【腾讯Bugly干货分享】舞动的表情包——浅析GIF格式图片的存储和压缩

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/v0pffOhjFWnVbU2lXjuEmw 导语 G ...

  9. 【设计经验】2、ISE中ChipScope使用教程

    一.软件与硬件平台 软件平台: 操作系统:Windows 8.1 开发套件:ISE14.7 硬件平台: FPGA型号:XC6SLX45-CSG324 二.ChipScope介绍 ChipScope是X ...

  10. docker发布netcore网站-零散记录

    安装docker 安装Linux,使用云服务器或者虚拟机 参考:http://www.cnblogs.com/wangjieguang/p/hyper-v-ubuntu.html 系统更新 sudo ...