1. 程式人生 > >手機端巧用input[date]

手機端巧用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()

然後,好像沒了,不說了吧。