基于zepto的移動(dòng)端輕量級(jí)日期插件--date_picker
前言
做過(guò)移動(dòng)Web開(kāi)發(fā)的同學(xué)都知道,移動(dòng)端日期選擇是很常見(jiàn)的需求。在PC端,我們有很豐富的選擇,比較出名的就有Mobiscroll和jQuery UI Datepicker。個(gè)人看來(lái),這些插件存在的兩個(gè)顯而易見(jiàn)的問(wèn)題,第一是過(guò)重的依賴(lài),對(duì)于jQuery的插件,已經(jīng)強(qiáng)制依賴(lài)了80多k的龐然大物,把很多移動(dòng)端項(xiàng)目拒之門(mén)外;第二是太過(guò)強(qiáng)大的功能,很多插件花百分之八十的時(shí)間去完善插件百分之二十炫酷的額外功能,導(dǎo)致代碼量變大,配置繁雜。所以一款少依賴(lài)、輕量級(jí)和使用簡(jiǎn)單的移動(dòng)端日期選擇插件是非常必要的。本文簡(jiǎn)單介紹近來(lái)寫(xiě)的一款基于zepto的移動(dòng)端輕量級(jí)日期插件--date_picker。
插件設(shè)計(jì)原則
只保留最必要的功能
日期選擇插件無(wú)非就是可以進(jìn)行年、月、日選擇,并且提供必要的年月切換動(dòng)畫(huà)特效,至于什么最小時(shí)間、最大時(shí)間、主題定制,概不在本插件功能范圍。
保留必要的依賴(lài)
本插件雖說(shuō)是基于zepto,實(shí)際上還隱性依賴(lài)了Github上面一個(gè)比較牛的庫(kù)fastclick。我們知道,移動(dòng)端點(diǎn)擊事件處理有兩個(gè)常見(jiàn)的問(wèn)題:(1)移動(dòng)端click事件有300ms,通常采用touch事件來(lái)代替click事件來(lái)提高靈敏性;(2)touch事件會(huì)存在穿透的問(wèn)題,一般插件都不用touch事件;基于這兩個(gè)問(wèn)題,fastclick做了兼容,只需要簡(jiǎn)單調(diào)用它提供的api就能夠愉快得和原本一樣調(diào)用click事件,所以這個(gè)依賴(lài)不能省。至于依賴(lài)zepto,實(shí)際上是可有可無(wú)的,一來(lái)博主平時(shí)工作都是寫(xiě)原生js的,不用插件也沒(méi)多大的感覺(jué),二來(lái)插件受眾面就會(huì)小一些。不過(guò)鑒于zepto在移動(dòng)端已然和zepto在PC端一樣如魚(yú)得水,就毫不客氣采用了。
既能夠支持模塊化又能本地引用文件使用的
久遠(yuǎn)一點(diǎn)的插件基本都是讓你下載一個(gè)文件,然后用script去引用,這樣本無(wú)可厚非,只不過(guò)放著最大的包管理器npm不用,豈不是對(duì)不起頁(yè)面仔這個(gè)稱(chēng)號(hào)。所以本插件支持文件引用也支持CMD方式的模塊引用。
功能介紹
直接上圖:
技術(shù)細(xì)節(jié)
transitionEnd事件
插件的主面板是當(dāng)前月份的天數(shù)詳情,如果點(diǎn)擊上一個(gè)月或者下一個(gè)月插件需要計(jì)算出上一個(gè)月或者下一個(gè)月的天數(shù)信息,然后插入到DOM節(jié)點(diǎn)中。在插入到DOM節(jié)點(diǎn)之后,就需要采用動(dòng)畫(huà)效果來(lái)顯示最新的一月并且褪去老的一個(gè)月,采用的方式是CSS2d轉(zhuǎn)化加過(guò)渡。我們需要處理的就是在舊的一個(gè)月褪去看不見(jiàn)的時(shí)候及時(shí)從DOM樹(shù)中刪除,不然如果用戶(hù)一直點(diǎn)下一個(gè)月或者上一個(gè)月的話(huà),內(nèi)存會(huì)炸的。為了實(shí)現(xiàn)這個(gè)移除功能,一個(gè)辦法是采用setTimeout事件在特定的時(shí)間去刪除節(jié)點(diǎn),經(jīng)過(guò)嘗試,發(fā)現(xiàn)由于Javascript定時(shí)器不準(zhǔn)確的特性和前后一個(gè)月切換帶來(lái)的邏輯復(fù)雜度增加,這種方案很不可行。
于是,本插件采用了第二個(gè)方案: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.
也就是只要你不去隨便亂動(dòng)元素的CSS屬性,在動(dòng)畫(huà)完成的時(shí)候,你就可以執(zhí)行相應(yīng)的操作(刪除節(jié)點(diǎn))。
再來(lái)看看兼容性:
對(duì)于移動(dòng)Web開(kāi)發(fā)足矣!
最后就是在綁定事件的兼容性問(wèn)題,不同廠(chǎng)商對(duì)于這個(gè)事件的定義并不一致,比如IOS里面監(jiān)聽(tīng)的是transitionend事件,但是在安卓里面監(jiān)聽(tīng)transitionend事件完全沒(méi)反應(yīng),經(jīng)過(guò)一番Google,發(fā)現(xiàn)安卓需要監(jiān)聽(tīng)webkitTransitionEnd事件。為了解決綁定事件時(shí)候的兼容性問(wèn)題,就需要檢測(cè)瀏覽器到底支持哪種事件。下面貼上Stackoverflow上面一個(gè)問(wèn)答的代碼片段:
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; }
安裝使用
安裝
支持下面兩種方式
- git clone之后直接拷貝引用bin文件夾下面的datepicker.min.css和datepicker.min.js
- 從npm下載安裝:npm install --save date_picker
使用
引用樣式datepicker.min.css
引用datepicker.min.js或者引用模塊var DatePicker = require('date_picker');
實(shí)例化組件,綁定插件日期選擇完成之后的回調(diào)函數(shù)
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(); };
插件外置兩個(gè)API: open和close,其中特別注意上面demo中_date在獲取焦點(diǎn)之后里面強(qiáng)制去除了焦點(diǎn),是為了避免安卓下面為input標(biāo)簽設(shè)置readonly屬性并不能禁止原生鍵盤(pán)彈出的問(wèn)題。
- zepto.js中tap事件阻止冒泡的實(shí)現(xiàn)方法
- zepto中使用swipe.js制作輪播圖附swipeUp,swipeDown不起效果問(wèn)題
- zepto與jquery的區(qū)別及zepto的不同使用8條小結(jié)
- 基于zepto.js實(shí)現(xiàn)仿手機(jī)QQ空間的大圖查看組件ImageView.js詳解
- 基于zepto.js簡(jiǎn)單實(shí)現(xiàn)上傳圖片
- 移動(dòng)端翻頁(yè)插件dropload.js(支持Zepto和jQuery)
- jQuery插件zepto.js簡(jiǎn)單實(shí)現(xiàn)tab切換
- Zepto實(shí)現(xiàn)密碼的隱藏/顯示
相關(guān)文章
jValidate 基于jQuery的表單驗(yàn)證插件
網(wǎng)上基于jQuery的表單驗(yàn)證插件已有很多,但是這個(gè)輪子我還是繼續(xù)做一個(gè),因?yàn)檫@個(gè)表單驗(yàn)證插件是從我以前的個(gè)人JS框架移值過(guò)來(lái)的(我已慢慢投入jQuery的懷抱),并且它的驗(yàn)證規(guī)則書(shū)寫(xiě)方式也許會(huì)讓你眼前一亮。2009-12-12jQuery實(shí)現(xiàn)鼠標(biāo)滾輪動(dòng)態(tài)改變樣式或效果
這篇文章主要介紹了jQuery實(shí)現(xiàn)鼠標(biāo)滾輪動(dòng)態(tài)改變樣式或效果,需要的朋友可以參考下2015-01-01jquery實(shí)現(xiàn)點(diǎn)擊瀏覽器返回上一頁(yè)按鈕并能直接刷新
這篇文章主要介紹了jquery實(shí)現(xiàn)點(diǎn)擊瀏覽器返回上一頁(yè)按鈕并能直接刷新,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12jQuery+css實(shí)現(xiàn)圖片滾動(dòng)效果(附源碼)
圖片滾動(dòng)效果想必大家都已司空見(jiàn)慣了吧,接下來(lái)本文介紹下jQuery+CSS實(shí)現(xiàn)圖片滾動(dòng),感興趣的你可不要錯(cuò)過(guò)了哈,希望可以幫助到你2013-03-03深入理解jquery的$.extend()、$.fn和$.fn.extend()
下面小編就為大家?guī)?lái)一篇深入理解jquery的$.extend()、$.fn和$.fn.extend()。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07JQuery擴(kuò)展插件Validate 3通過(guò)參數(shù)設(shè)置錯(cuò)誤信息
最終顯示在頁(yè)面上的錯(cuò)誤分為兩種:第一種是默認(rèn)錯(cuò)誤信息,該信息已經(jīng)被定義在插件中了,可以手動(dòng)修改。2011-09-09jquery easyui 對(duì)于開(kāi)始時(shí)間小于結(jié)束時(shí)間的判斷示例
對(duì)于開(kāi)始時(shí)間小于結(jié)束時(shí)間的判斷可以參考,jquery easyui里的ValidateBox進(jìn)行判斷,需要的朋友可以參考下2014-03-03jQuery簡(jiǎn)單創(chuàng)建節(jié)點(diǎn)的方法
這篇文章主要介紹了jQuery簡(jiǎn)單創(chuàng)建節(jié)點(diǎn)的方法,涉及jQuery獲取節(jié)點(diǎn)及append添加元素創(chuàng)建節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下2016-09-09