基于zepto的移动端轻量级日期插件--date_picker


Posted in Javascript onMarch 04, 2016

前言

做过移动Web开发的同学都知道,移动端日期选择是很常见的需求。在PC端,我们有很丰富的选择,比较出名的就有Mobiscroll和jQuery UI Datepicker。个人看来,这些插件存在的两个显而易见的问题,第一是过重的依赖,对于jQuery的插件,已经强制依赖了80多k的庞然大物,把很多移动端项目拒之门外;第二是太过强大的功能,很多插件花百分之八十的时间去完善插件百分之二十炫酷的额外功能,导致代码量变大,配置繁杂。所以一款少依赖、轻量级和使用简单的移动端日期选择插件是非常必要的。本文简单介绍近来写的一款基于zepto的移动端轻量级日期插件--date_picker。

插件设计原则

只保留最必要的功能

日期选择插件无非就是可以进行年、月、日选择,并且提供必要的年月切换动画特效,至于什么最小时间、最大时间、主题定制,概不在本插件功能范围。

保留必要的依赖

本插件虽说是基于zepto,实际上还隐性依赖了Github上面一个比较牛的库fastclick。我们知道,移动端点击事件处理有两个常见的问题:(1)移动端click事件有300ms,通常采用touch事件来代替click事件来提高灵敏性;(2)touch事件会存在穿透的问题,一般插件都不用touch事件;基于这两个问题,fastclick做了兼容,只需要简单调用它提供的api就能够愉快得和原本一样调用click事件,所以这个依赖不能省。至于依赖zepto,实际上是可有可无的,一来博主平时工作都是写原生js的,不用插件也没多大的感觉,二来插件受众面就会小一些。不过鉴于zepto在移动端已然和zepto在PC端一样如鱼得水,就毫不客气采用了。

既能够支持模块化又能本地引用文件使用的

久远一点的插件基本都是让你下载一个文件,然后用script去引用,这样本无可厚非,只不过放着最大的包管理器npm不用,岂不是对不起页面仔这个称号。所以本插件支持文件引用也支持CMD方式的模块引用。

功能介绍

直接上图:

基于zepto的移动端轻量级日期插件--date_picker

技术细节

transitionEnd事件

插件的主面板是当前月份的天数详情,如果点击上一个月或者下一个月插件需要计算出上一个月或者下一个月的天数信息,然后插入到DOM节点中。在插入到DOM节点之后,就需要采用动画效果来显示最新的一月并且褪去老的一个月,采用的方式是CSS2d转化加过渡。我们需要处理的就是在旧的一个月褪去看不见的时候及时从DOM树中删除,不然如果用户一直点下一个月或者上一个月的话,内存会炸的。为了实现这个移除功能,一个办法是采用setTimeout事件在特定的时间去删除节点,经过尝试,发现由于Javascript定时器不准确的特性和前后一个月切换带来的逻辑复杂度增加,这种方案很不可行。
于是,本插件采用了第二个方案:transitionEnd事件。直接引用一下MDN的介绍:

The transitionend event is fired when a CSS transition has completed. In the case where a transition is removed before completion, such as if the transition-property is removed, then the event will not fire. The event will also not fire if the animated element becomes display: none before the transition fully completes.

也就是只要你不去随便乱动元素的CSS属性,在动画完成的时候,你就可以执行相应的操作(删除节点)。
再来看看兼容性:

基于zepto的移动端轻量级日期插件--date_picker

对于移动Web开发足矣!

最后就是在绑定事件的兼容性问题,不同厂商对于这个事件的定义并不一致,比如IOS里面监听的是transitionend事件,但是在安卓里面监听transitionend事件完全没反应,经过一番Google,发现安卓需要监听webkitTransitionEnd事件。为了解决绑定事件时候的兼容性问题,就需要检测浏览器到底支持哪种事件。下面贴上Stackoverflow上面一个问答的代码片段:

function whichTransitionEvent() {
  var t,
   el = document.createElement('fakeelement');
   transitions = {
    'OTransition'  :'oTransitionEnd',
    'MSTransition'  :'msTransitionEnd',
    'MozTransition'  :'transitionend',
    'WebkitTransition' :'webkitTransitionEnd',
    'transition'   :'transitionEnd'
   };

  for(t in transitions){
   if( el.style[t] !== undefined ){
    return transitions[t];
   }
  }

  return false;
 }

安装使用

安装

支持下面两种方式

  1. git clone之后直接拷贝引用bin文件夹下面的datepicker.min.css和datepicker.min.js
  2. 从npm下载安装:npm install --save date_picker

使用

引用样式datepicker.min.css
引用datepicker.min.js或者引用模块var DatePicker = require('date_picker');
实例化组件,绑定插件日期选择完成之后的回调函数

var _date = document.getElementById('date');

 var datePicker = new DatePicker({
  confirmCbk: function(data) {
   _date.value = data.year + '-' + data.month + '-' + data.day;
  }
 });

 _date.onfocus = function(e) {
  _date.blur();
  datePicker.open();
 };

插件外置两个API: open和close,其中特别注意上面demo中_date在获取焦点之后里面强制去除了焦点,是为了避免安卓下面为input标签设置readonly属性并不能禁止原生键盘弹出的问题。

Javascript 相关文章推荐
如何在标题栏显示框架内页面的标题
Feb 03 Javascript
JavaScript 在线压缩和格式化收藏
Jan 16 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
基于jquery封装的一个js分页
Nov 15 Javascript
举例讲解Node.js中的Writable对象
Jul 29 Javascript
详解Node.js:events事件模块
Nov 24 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
vue.js根据代码运行环境选择baseurl的方法
Feb 28 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
Mar 14 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
JS异步执行结果获取的3种解决方式
Feb 19 Javascript
利用 JavaScript 构建命令行应用
Nov 17 Javascript
基于Javascript实现二级联动菜单效果
Mar 04 #Javascript
jquery ajax双击div可直接修改div中的内容
Mar 04 #Javascript
js实现文字滚动效果
Mar 03 #Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 #Javascript
JQuery日期插件datepicker的使用方法
Mar 03 #Javascript
jQuery日历插件datepicker用法详解
Mar 03 #Javascript
初步使用Node连接Mysql数据库
Mar 03 #Javascript
You might like
php注入实例
2006/10/09 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
python变量不能以数字打头详解
2016/07/06 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python 处理数据的实例详解
2017/08/10 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
解决Python3下map函数的显示问题
2019/12/04 Python
Python 多进程、多线程效率对比
2020/11/19 Python
python实现经典排序算法的示例代码
2021/02/07 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
历史专业毕业生的自我鉴定
2013/11/15 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
文案策划岗位职责
2015/02/11 职场文书
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android