DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> jQuery入門知識 >> JQuery特效代碼 >> jQuery實現簡單的日期輸入格式化控件
jQuery實現簡單的日期輸入格式化控件
編輯:JQuery特效代碼     

js代碼有一百多行。

先上效果圖

 html代碼

日期: <input type="text" id="dateInputer" class="hhm-dateInputer" placeholder="請輸入日期">

設置input元素類名為 hhm-dateInputer,通過這個類來綁定這個日期輸入控件。

js代碼

這裡應用了jQuery的庫, 主要用於選擇元素和綁定事件。

代碼如下:
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

因為有大量的獲取和設置光標位置操作,用到了上一篇博客介紹的幾個工具函數。

代碼如下:
//獲取光標位置
function getCursor(elem) {
     //IE 9 ,10,其他浏覽器
     if (elem.selectionStart !== undefined) {
         return elem.selectionStart;
     } else { //IE 6,7,8
         var range = document.selection.createRange();
         range.moveStart("character", -elem.value.length);
         var len = range.text.length;
         return len;
     }
 }
//設置光標位置
 function setCursor(elem, index) {
     //IE 9 ,10,其他浏覽器
     if (elem.selectionStart !== undefined) {
         elem.selectionStart = index;
         elem.selectionEnd = index;
     } else { //IE 6,7,8
         var range = elem.createTextRange();
         range.moveStart("character", -elem.value.length); //左邊界移動到起點
         range.move("character", index); //光標放到index位置
         range.select();
     }
 }
//獲取選中文字
 function getSelection(elem) {
     //IE 9 ,10,其他浏覽器
     if (elem.selectionStart !== undefined) {
         return elem.value.substring(elem.selectionStart, elem.selectionEnd);
     } else { //IE 6,7,8
         var range = document.selection.createRange();
         return range.text;
     }
 }
//設置選中范圍
 function setSelection(elem, leftIndex, rightIndex) {
     if (elem.selectionStart !== undefined) { //IE 9 ,10,其他浏覽器
         elem.selectionStart = leftIndex;
         elem.selectionEnd = rightIndex;
     } else { //IE 6,7,8
         var range = elem.createTextRange();
         range.move("character", -elem.value.length); //光標移到0位置。
         //這裡一定是先moveEnd再moveStart
         //因為如果設置了左邊界大於了右邊界,那麼浏覽器會自動讓右邊界等於左邊界。
         range.moveEnd("character", rightIndex);
         range.moveStart("character", leftIndex);
         range.select();
     }
 }

-------------------------            Boom!         -----------------------

先講講主要的思路。 其實是可以畫個圖這裡的,不過我都不曉得該怎麼畫,大家提提意見。

     首先找到類名為 hhm-dateInputer的元素。

     給它綁定兩個事件處理函數。 keydown、focus 、blur

  focus

    判斷如果input元素內容為空,那麼設置其初始值為"____-__-__"

  blur  (感謝下面評論裡小伙伴的建議,加上這個事件更加完美)

    判斷如果input元素內容為初始值"____-__-__",將其值置為空""

      keydown

    為什麼不是keyup,而是keydown:  我們知道,keydown事件發生時,鍵盤上的字符還沒有輸入到輸入框中,這很重要。如果需要,我們在程序中就可以阻止不合適的字符輸入。

    1.首先從事件對象event中取得keyCode值,判斷為數字時,將數字後面的下劃線刪除一位。
    2.keyCode值代表刪除鍵時,刪除數字,添加一位下劃線。
    3.keyCode的其他情況返回false,阻止字符的輸入。

    上面一二步會用到setTimeout函數,在其中執行某些操作。 使用這個函數是因為keyup事件中按鍵字符實際還沒有作用到文本框中,setTimeout中的操作可以解決這個問題。

另外代碼中還有一個很重要的方法 resetCursor,程序中多次調用這個方法來把光標設置到合適的輸入位置。

代碼如下:
 //設置光標到正確的位置
 function resetCursor(elem) {
     var value = elem.value;
     var index = value.length;
     //當用戶通過選中部分文字並刪除時,此時只能將內容置為初始格式洛。
     if (elem.value.length !== dateStr.length) {
         elem.value = dateStr;
     }
     //把光標放到第一個_下劃線的前面
     //沒找到下劃線就放到末尾
     var temp = value.search(/_/);
     index = temp > -1 ? temp : index;
     setCursor(elem, index);
 }

完整的js代碼貼在下面咯。

代碼如下:
$(function(){
    var inputs = $(".hhm-dateInputer");
    var dateStr = "____-__-__";
    inputs.each(function(index,elem){
        var input = $(this);
        input.on("keydown",function(event){
            var that = this;   //當前觸發事件的輸入框。
            var key = event.keyCode;
            var cursorIndex = getCursor(that);
            //輸入數字
            if(key >= 48 && key <= 57){
                //光標在日期末尾或光標的下一個字符是"-",返回false,阻止字符顯示。
                if(cursorIndex == dateStr.length || that.value.charAt(cursorIndex) === "-") {return false;}
                //字符串中無下劃線時,返回false
                if(that.value.search(/_/) === -1){return false;}
                var fron = that.value.substring(0,cursorIndex); //光標之前的文本
                var reg = /(\d)_/;
                setTimeout(function(){ //setTimeout後字符已經輸入到文本中
                    //光標之後的文本
                    var end = that.value.substring(cursorIndex,that.value.length);
                    //去掉新插入數字後面的下劃線_
                    that.value = fron + end.replace(reg,"$1");
                    //尋找合適的位置插入光標。
                    resetCursor(that);
                },1);
                return true;
                //"Backspace" 刪除鍵
            }else if( key == 8){
                //光標在最前面時不能刪除。  但是考慮全部文本被選中下的刪除情況
                if(!cursorIndex && !getSelection(that).length){ return false;}
                //刪除時遇到中劃線的處理
                if(that.value.charAt(cursorIndex -1 ) == "-"){
                    var ar = that.value.split("");
                    ar.splice(cursorIndex-2,1,"_");
                    that.value = ar.join("");
                    resetCursor(that);
                    return false;
                }
                setTimeout(function(){
                    //值為空時重置
                    if(that.value === "") {
                        that.value = "____-__-__";
                        resetCursor(that);
                    }
                    //刪除的位置加上下劃線
                    var cursor = getCursor(that);
                    var ar = that.value.split("");
                    ar.splice(cursor,0,"_");
                    that.value = ar.join("");
                    resetCursor(that);
                },1);
                return true;
            }
            return false;
        });
        input.on("focus",function(){
            if(!this.value){
                this.value = "____-__-__";
            }
            resetCursor(this);
        });
        input.on("blur",function(){
            if(this.value === "____-__-__"){
                this.value = "";
            }
        });
    });
    //設置光標到正確的位置
    function resetCursor(elem){
        var value = elem.value;
        var index = value.length;
        //當用戶通過選中部分文字並刪除時,此時只能將內容置為初始格式洛。
        if(elem.value.length !== dateStr.length){
            elem.value = dateStr;
        }
        var temp = value.search(/_/);
        index =  temp> -1? temp: index;
        setCursor(elem,index);
        //把光標放到第一個_下劃線的前面
        //沒找到下劃線就放到末尾
    }
});
function getCursor(elem){
    //IE 9 ,10,其他浏覽器
    if(elem.selectionStart !== undefined){
        return elem.selectionStart;
    } else{ //IE 6,7,8
        var range = document.selection.createRange();
        range.moveStart("character",-elem.value.length);
        var len = range.text.length;
        return len;
    }
}
function setCursor(elem,index){
    //IE 9 ,10,其他浏覽器
    if(elem.selectionStart !== undefined){
        elem.selectionStart = index;
        elem.selectionEnd = index;
    } else{//IE 6,7,8
        var range = elem.createTextRange();
        range.moveStart("character",-elem.value.length); //左邊界移動到起點
        range.move("character",index); //光標放到index位置
        range.select();
    }
}
function getSelection(elem){
    //IE 9 ,10,其他浏覽器
    if(elem.selectionStart !== undefined){
        return elem.value.substring(elem.selectionStart,elem.selectionEnd);
    } else{ //IE 6,7,8
        var range = document.selection.createRange();
        return range.text;
    }
}
function setSelection(elem,leftIndex,rightIndex){
    if(elem.selectionStart !== undefined){ //IE 9 ,10,其他浏覽器
        elem.selectionStart = leftIndex;
        elem.selectionEnd = rightIndex;
    } else{//IE 6,7,8
        var range = elem.createTextRange();
        range.move("character",-elem.value.length);  //光標移到0位置。
        //這裡一定是先moveEnd再moveStart
        //因為如果設置了左邊界大於了右邊界,那麼浏覽器會自動讓右邊界等於左邊界。
        range.moveEnd("character",rightIndex);
        range.moveStart("character",leftIndex);
        range.select();
    }
}

結束語

這個插件可能還有一些需要完善的地方。

  缺少通過js調用為元素綁定此插件的接口

  插件可能有些bug

上面的代碼如果有任何問題,請大家不吝賜教。

以上就是本文的全部內容了,希望大家能夠喜歡。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved