手機端巧用input[date]
應用場景:生命計算器,允許使用者輸入自己的出生年月,根據用的資料計算出相關的過去和未來100歲的資料。
分析:這個應用主要兩個點。1,使用者的輸入是自由的;2,浮點數和整數的處理。技術點不多,也不難,算是鞏固一下javascript的Date,Math兩個物件。
一、使用者的輸入
允許使用者輸入,必然會有資料的準確性驗證。可以有兩個選擇。1,使用者的手動輸入;2,提供日期選擇器。
對於使用者的手動輸入,首先需要限制一下輸入格式,比如:”19890102“,”1989-01-20“,‘1989/01/22’,”1989 08 22“等各種的格式說明。
即便我們為了提示使用者非常的顯眼的告訴使用者了輸入格式,但是還是會有使用者不按常理出牌,只能進行驗證。
既然打算驗證,那肯定不能隨意為之,除了日期格式正確之外還有日期的有效性,比如:我們可以限定一下出生日期要在1900之後或者再晚點比如1940,畢竟使用者群都比較年輕,這個資料可以討論一下。然後是月份和日期的有效性,要符合自然月的規則。說多了,這樣驗證下去的話,還要找閏年,心好累。這麼複雜的正則我一時半會也想不出來,去覺得可能只依靠正則可能不能實現。
為了更快的出成品,選擇第二種方案,而第二種方案的日期選擇器的實現曾經也是一個大老難,也不想說了,無非就是什麼j*的外掛。
綜合產品需求,這是個只在手機端使用並且要輕量級的一個頁面,所以前面一大串廢話只是想體現以下,做技術的不容易,在決定用什麼方案之前,都其實不知道燒死了多少腦細胞了。
進入正題,input[date],這個H5新興家族成員之一,也不乏會有支援缺陷。
1、屬性max手機端並沒有實現,
2、屬性min同理,
3、屬性value實現的並不完善,手機的智慧處理導致的,選擇日期時無論ios還是Android都是彈出對話方塊,而對話方塊的預設值是當前日期,這個控制不了,導致如果不操作的話,日期值就預設為當前,手動設定是不生效的。
以上三個問題不能通過H5直接解決。
只能在最後檢測一下是否超出邊界值了,這個驗證還是很簡單的。
還好input[date]的日期值在各個平臺上都是統一的,”1989-01-20“,用‘-’連線。所以判斷就直接轉換成陣列了.
var userDate = document.getElementById('date').value.split('-'), userDateObj = { year : userDate[0], month : userDate[1], date : userDate[2] }, nowDate = new Date(), nowDateObj = { year : nowDate.getFullYear(), month : nowDate.getMonth() + 1, date : nowDate.getDate() }; function dateIsOk(){ if(userDateObj.year <= nowDateObj.year && userDateObj.month <= nowDateObj.month && userDateObj.date <= nowDateObj.date){ return true; }else{ return false; } }
做了一下日期只要不超過今天即可的限制。
二、浮點數和整數的處理
主要應用點在於,1,你活了幾歲;2,如果能夠活到100歲,你還有多少天可活;3,活了這麼久你吃了幾噸食物。
以上三點有一個共同點就是他們的單位導致了數字會是小數,這就涉及到了javascript中浮點數的位數以及怎麼取捨了.
parseFloat() // 函式可解析一個字串,並返回一個浮點數。如下方法:
/*
* num : 第一個運算元
* num2 : 第二個運算元
* operator : 運算子
* n : 小數需要保留的位數
*/
function fixFloat(num, operator, num2, n){
var regNum = /\d/,
regOper = /(\*|\/){1}/;
if((regNum.test(num) && regNum.test(num2) && regOper.test(operator) && regNum.test(n)){
if(operator === '*'){
return parseFloat(num * num2).toFixed(n);
}else{
return parseFloat(num / num2).toFixed(n);
}
}else{
console.log('err')
}
}
整數處理就不多說了,參見 parseInt()
然後,好像沒了,不說了吧。