`

Zepto 这个著名的 DOM

 
阅读更多

http://chaoskeh.com/blog/some-experience-of-using-zepto.html

前段时间完成了公司一个产品的 HTML5 触屏版,开发中使用了 Zepto 这个著名的 DOM 操作库。
为什么不是 jQuery 呢?因为 jQuery 的目标是兼容所有主流浏览器,这就意味着它的大量代码对移动端的浏览器是无用或者低效的。
而 Zepto 只针对移动端浏览器编写,因此体积更小、效率更高,更重要的是,它的 API 完全仿照 jQuery ,所以学习成本也很低。

但是在开发过程中,我发现 Zepto 还远未成熟,其中包含了一些或大或小的“坑”,与 jQuery 的差距还是很明显的,所以写篇文章记录下,希望对后来者有帮助
注意,本文撰写时 Zepto 版本为 1.0 正式版

从哪里下载 Zepto

这个问题看起来很蠢,从官网下载不就行了嘛!可是你有没有发现下载链接上面有行小字呢?

There are more modules; a list of all modules is available in the README.

在这个 README 里面你会惊奇地发现,Zepto 源码中有 14 个模块,而官网提供的标准版里面只有 7 个模块!而且居然不包含对移动端开发非常重要的 touch 模块(提供对触摸事件的支持)!
所以我的建议是,不要从官网下载,而是从 Github 下载了源代码之后自己 Build 一个版本,这样你可以自行挑选适合的模块。比如我挑选的模块是这么几个:

  • polyfill,zepto,detect,event,ajax,form,fx 这7个就是标准版包含的模块
  • fx_methods 有了这个模块之后,.show() .hide() 等几个方法才能支持动画了,比如 .show('fast')
  • data 提供对 .data() 方法的完整支持,像 jQuery 一样用内存对象存储
  • assets 移除 img 元素后做一些特殊处理,用来清理内存
  • selector 更多的选择器的支持,后面会提到
  • touch 对触摸事件的支持,比如 tap 事件

如果你对 Node 不了解不知道如何 Build 的话,可以下载我的版本

不要用 click 事件,用 tap 代替

这个估计已经广为人知了,因为 click 事件有 200~300 ms 的延迟,为了更快的响应,最好用 Zepto 提供的 tap 事件
不相信的话,可以用以下代码测试一下

var t1,t2;
$('#id').tap(function () {
    t1 = Date.now();
});
$('#id').click(function () {
    t2 = Date.now();
    alert(t2 - t1);
});

Zepto 对 CSS 选择器的支持

郑重提醒,:text :checkbox :first 等等在 jQuery 里面很常用的选择器,Zepto 不支持!
原因很简单,jQuery 通过自己编写的 sizzle 引擎来支持 CSS 选择器,而 Zepto 是直接通过浏览器提供的 document.querySelectorAll 接口。
这个接口只支持标准的 CSS 选择器,而上面提到的那些属于 jQuery 选择器扩展,所以仔细看看这个网页,注意一下这些选择器。

当然也有好消息,就是上面提到的 selector 模块,如果有这个模块的话,能够支持 部分 的 jQuery 选择器扩展,列举如下:

  • :visible :hidden
  • :selected :checked
  • :parent
  • :first :last :eq
  • :contains :has

元素的尺寸计算

首先 Zepto 没有 .innerHeight() .outerWidth() 等四个方法,其次,它的 .height()/.width() 方法也不完善,对于 display:none 的元素,计算出的高宽都是 0
而这在 jQuery 里面是没有问题的,因为 jQuery 针对这种元素,会先设置其 css 样式设置为position: "absolute", visibility: "hidden", display: "block" 
计算完高宽后再恢复,参见 https://github.com/jquery/jquery/blob/master/src/css.js#L460
如果遇到这种特殊情况,可以参考 jQuery 写一个类似的方法

.prop() 方法的陷阱

有次我要把一个文本框置为只读,写了这么一行 $('#text').prop('readonly', true) 结果死活不工作
找了半天才发现,正确的写法是这样 $('#text').prop('readOnly', true) ,如果你居然看不出两者的差别,那么悄悄提示你:注意大小写!
翻了一下相关的文档,原来只读属性的正确拼法确实是 readOnly,可是在 jQuery 里面上一段代码却能正常工作
于是到 jQuery 源码里面一找才发现,还有这么一段 https://github.com/jquery/jquery/blob/master/src/attributes.js#L466

jQuery.each([
    "tabIndex",
    "readOnly",
    "maxLength",
    "cellSpacing",
    "cellPadding",
    "rowSpan",
    "colSpan",
    "useMap",
    "frameBorder",
    "contentEditable"
], function() {
    jQuery.propFix[ this.toLowerCase() ] = this;
});

从这里也能看到,jQuery 的成熟度真是难以超越,因为他把我们都惯坏了……
考虑到这段代码比较简单,我厚颜无耻地抄袭了一下然后给 Zepto 提了一个 pull request ,如果你们喜欢这种无脑的用法,可以去评论表达支持(记得用英文)

.show() 的动画效果

如果没有 fx_mehods 模块的话,.show() 方法是不支持动画的,不过有了这模块后,动画的支持还是有点小问题,比如这么一段 HTML

<div style="background:black;opacity:0.7;display:none">
    test
</div>

如果你调用 $('div').show('fast') ,那么动画完成后你看到的不会是一个半透明的元素,而是全黑不透明的
因为 Zepto 的 .show() 动画实现的很简单,没有高宽的变化,而是将透明度从 0 逐渐变为 1,所以元素上原来设置的透明度就被替代了。
这种情况下,可以用 .fadeIn() 方法来替代 .show()

结语

看到这里相信你已经了解为什么我说” Zepto 还远未成熟“,目前它其实还仅仅处于“能用”,远未达到 jQuery “好用”的地步
最后,关于整个 HTML5 触屏版的前端开发,我有篇 Slide 做了总结,本文只是其中关于 Zepto 部分的详细阐述,感兴趣的可以去看看

 

分享到:
评论

相关推荐

    zepto:node了一个

    总结来说,这个项目涉及了使用Node.js环境下的Zepto库,通过各个模块实现了丰富的功能,包括DOM操作、事件处理、异步通信、表单处理、动画效果、数据存储以及触摸事件支持,旨在构建高效、互动性强的Web应用。

    Zepto集成touch版本

    将这两个文件引入到项目中,就可以在网页中使用Zepto的API来操作DOM元素、处理事件、执行动画等。 对于"touch"相关的特性,Zepto集成了如`touchstart`、`touchmove`、`touchend`等触摸事件,以及滑动(swipe)、...

    zepto.js的中文手册,中文api说明,zepto中文注释

    Zepto.js是一个轻量级的JavaScript库,旨在为移动Web开发提供与jQuery类似的API。它体积小、性能高且易于使用,非常适合移动设备上的Web应用开发。Zepto.js支持大部分jQuery的核心功能,包括DOM操作、事件处理、Ajax...

    zepto.js中文离线手册网页版

    这个手册通常包含了Zepto.js的所有核心模块和插件的详细说明,包括选择器、DOM操作、事件处理、动画效果、Ajax请求以及各种实用工具方法等。通过这个离线手册,开发者可以快速查找和理解Zepto.js的各种用法,提高...

    zepto 中文api文档 【离线文件】

    zepto.js 是一个轻量级的JavaScript库,主要针对移动设备和现代浏览器,它提供了类似于jQuery的核心功能,包括选择器、DOM操作、事件处理、动画效果以及Ajax等。这个压缩包包含了一份Zepto中文API的离线文档,方便...

    移动端zepto工具包

    Zepto是一个轻量级的JavaScript库,专门为移动设备设计,特别是在iOS和Android平台上。它旨在为移动Web开发提供类似于jQuery的API,使开发者能够轻松地处理DOM操作、事件处理、动画效果以及Ajax交互。在移动端,...

    mobiscroll.zepto.zip

    这个文件名看起来像是一个 Git 提交哈希,可能包含了开发者在集成 Mobiscroll 与 Zepto 时的一些实验或示例代码,对于理解两者如何协同工作会有所帮助。 总的来说,结合 Mobiscroll 的强大功能和 Zepto 的高性能,...

    zepto手机移动端弹出提示框图标动画特效

    总的来说,这个资源提供了一个实用的移动端提示框解决方案,结合了Zepto的高效性能和丰富的动画效果,旨在提升用户在手机应用中的交互体验。开发者可以在此基础上进行二次开发,以适应自己的项目需求。学习和掌握...

    zepto离线手册

    1. **zepto.js的基本结构**:Zepto的核心是一个选择器引擎,用于高效地查找DOM元素。它以"$"符号作为入口点,如`$(selector)`,与jQuery类似。 2. **选择器支持**:Zepto支持CSS 3的选择器,包括类选择器、ID选择器...

    zepto包含touch模块

    zepto.js是一个轻量级的JavaScript库,专为移动设备的Web开发设计,尤其是针对触摸屏设备。它提供了类似于jQuery的API,使开发者能够轻松地处理DOM操作、事件处理、动画效果以及Ajax交互。在标题提到的"zepto包含...

    zepto 通讯录完整列表,A-Z列表

    总结来说,"zepto 通讯录完整列表,A-Z列表"这个项目展示了如何利用Zepto.js来实现一个常见但实用的功能。通过理解并运用这些技术,开发者可以为用户提供更流畅、更友好的交互体验,尤其是在移动端应用中。

    javascript框架- zepto.js

    总的来说,zepto.js是一个为移动Web开发精心打造的工具,通过精简的功能集和优秀的性能,使得开发者可以在有限的资源下构建功能丰富的移动应用。尽管它不如jQuery功能全面,但其轻量化和针对性的设计使得它在特定...

    移动框架zepto.js

    1. **DOM操作**:Zepto.js提供了简洁的DOM选择器,如$(selector)用于选取元素,以及一系列与jQuery类似的DOM操作方法,如`.append()`、`.prepend()`、`.html()`等,方便地对HTML元素进行操作。 2. **事件处理**:...

    zepto库中touch.js

    Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api。 如果你会用jquery,那么你也会用zepto。touch库实现'swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap',...

    jquery validation 支持zepto

    让jquery validation plugin 支持zepto

    zepto文档api及其js文件

    - `$()`:这是Zepto的核心函数,用于选择DOM元素。例如,`$('div')`将选择所有的div元素。 - `each()`:遍历集合中的每个元素,允许你在每个元素上执行操作。 - `get()`:获取选中元素的一个特定索引的元素。 - ...

    zepto-cookie-master

    本文将深入探讨"zepto-cookie-master"这个项目,它是一个专门用于处理Cookie操作的Zepto插件。 Cookie是Web开发中一个重要的技术,用于存储客户端的小量数据,比如用户设置、会话信息等。在Zepto库中,如果没有专门...

    zepto api document

    1. `$.fn.extend()`: 这个方法允许你扩展Zepto的原型链,从而增加新的功能或方法。例如,你可以定义一个`fadeIn()`方法来实现淡入效果。 2. `$(selector).each(callback)`: 这个方法遍历选择的元素集合,并对每个...

    zepto下的page切换控件

    Zepto.js支持CSS选择器、DOM操作、事件处理、动画等,是构建移动Web应用的一个好工具。它的API设计与jQuery相似,使得熟悉jQuery的开发者可以快速上手。 2. **Page容器**:在zepto-page-transitions中,每个页面...

    zepto源码及其中文翻译和解析

    1. **zepto.js**: 这是Zepto的核心文件,包含了基本的DOM操作、事件、动画和Ajax等功能。源码采用模块化设计,通过模块加载机制,用户可以根据需要引入特定的模块,如touch模块用于触摸事件,selector模块用于CSS...

Global site tag (gtag.js) - Google Analytics