zoukankan      html  css  js  c++  java
  • 耗时输入框

    前言:

    在系统中有输入耗时的需求,用于描写叙述一个活动花费多少时间。
    详细要求:
    精确到分钟,仅仅同意录入小时和分钟,不同意输入不合法的字符,或者做对应的校验。
    设计:
    依据需求考虑使用js的键盘时间来进行控制,精巧非数字以外的字符录入至输入框中,这样就须要校验了。



    实现代码(支持ie及chrome)

    页面

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    		<title></title>
    	</head>
    	<script language="JavaScript" type="text/javascript" src="jquery-1.3.1.min.js"></script>
    	<!--inputTime.js 用到 jquery-position.js 组件-->
    	<script language="JavaScript" type="text/javascript" src="inputTime.js"></script>
    	<script language="JavaScript" type="text/javascript">
    		$(document).ready(function(){
    			bindInputTimeEvent('txt1')
    			bindInputTimeEvent('txt2')
    			bindInputTimeEventByClass('cls1')
    		})
    	</script>
    	<body>
    		測试耗时输入框(最大小时数:99	 最大分钟数:59) <br><br>
    		耗时-绑定id:<input id='txt1' type="text"  value="" maxlength=5 style="ime-mode:disabled"/>
    		耗时-绑定class:<input class='cls1' type="text"  value="" maxlength=5 style="ime-mode:disabled"/>
    		耗时-99小时模式(input中新建timeTpye='99'):<input class='cls1' type="text"  value="" maxlength=5 timeTpye='99'/>
    	</body>
    </html>
    



    inputTime.js

    /**
     * @author 全冠清(获得当前的输入框位置)
     */
    $.fn.extend({
    	position:function( value ){
    		var elem = this[0];
    			if (elem&&(elem.tagName=="TEXTAREA"||elem.type.toLowerCase()=="text")) {
    			   if($.browser.msie){
    					   var rng;
    					   if(elem.tagName == "TEXTAREA"){ 
    						    rng = event.srcElement.createTextRange();
    						    rng.moveToPoint(event.x,event.y);
    					   }else{ 
    					    	rng = document.selection.createRange();
    					   }
    					   if( value === undefined ){
    					   	 rng.moveStart("character",-event.srcElement.value.length);
    					     return  rng.text.length;
    					   }else if(typeof value === "number" ){
    					   	 var index=this.position();
    						 index>value?( rng.moveEnd("character",value-index)):(rng.moveStart("character",value-index))
    						 rng.select();
    					   }
    				}else{
    					if( value === undefined ){
    					   	 return elem.selectionStart;
    					   }else if(typeof value === "number" ){
    					   	 elem.selectionEnd = value;
           			         elem.selectionStart = value;
    					   }
    				}
    			}else{
    				if( value === undefined )
    				   return undefined;
    			}
    	}
    })
    
    
    
    /**
     * @author yzp
     */
    // 绑定输入框事件 通过id
    function bindInputTimeEvent(textid){
    	$('#'+textid).click(inputTimeClick)
    	$('#'+textid).keydown(inputTimeKeydown)
    	$('#'+textid).keyup(inputTimeKeyup)
    }
    
    /**
     * @author yzp
     */
    // 绑定输入框事件 通过class
    function bindInputTimeEventByClass(textid){
    	$('.'+textid).click(inputTimeClick)
    	$('.'+textid).keydown(inputTimeKeydown)
    	$('.'+textid).keyup(inputTimeKeyup)
    }
    
    
    // 点击输入框则回到第一个位置
    function inputTimeClick(){
    	$(this).position(0);
    	// alert($(this).val());
    }
    /* 
    *	按键的首个触发事件,此时的value 还是输入之前的
    *  在keydown方法中 假设返回false 输入字符则不在文本框中显示
    */
    function inputTimeKeydown(e){
    	//alert(event.keyCode);
    	//alert($(this).val());
    	// 字符超过5个就不能输入
    	var inputValue = $(this).val();
    	
    	
    	if(inputValue.length>5){
    		return false;
    	}
    
    
    	// 进行字符处理,自己主动更新时间
    	if ((e.keyCode>=48 && event.keyCode<=57) || (e.keyCode>=96 && event.keyCode<=105)){ //数字键不禁用
    		var inputValue = $(this).val();
    		var pos = $(this).position()
    		var fontStr 
    		var tailStr
    		
    		// 假设是全时间模式(非24小时)
    		if($(this).attr('timeTpye')=='99'){
    			
    		}else{ //24小时模式
    			// 限制最大小时为23小时
    			if(pos==0){
    				if( (e.keyCode>=51 && e.keyCode<=57) || (e.keyCode>=99 && event.keyCode<=105)){
    					return false;
    				}
    				// (修复第二遍输入时仅仅输入第一位导致的bug)
    				inputValue = "00:00";
    // 				alert("xx");
    			}
    			if(pos==1){
    				fontStr = inputValue.substring(0,pos);
    				//alert(fontStr)
    				if(fontStr==2){ //当第一位是2的时候,第二位最多是3 ,为了满足最多23点
    					if( (e.keyCode>=52 && e.keyCode<=57) || (e.keyCode>=100 && event.keyCode<=105)){
    						return false;
    					}
    				}
    				
    			}
    		}
    		if(pos==2){
    			
    			fontStr = inputValue.substring(0,pos)+":";
    			pos ++;
    			tailStr = inputValue.substring(pos+1,6);
    			
    		}else{
    			fontStr = inputValue.substring(0,pos);
    			tailStr = inputValue.substring(pos+1,6);
    		}
    		// 限制最大分钟为59分钟
    		if(pos==3){
    			if( (e.keyCode>=54 && e.keyCode<=57) || (e.keyCode>=102 && event.keyCode<=105)){
    				return false;
    			}
    		}
    		// alert($(this).val());
    
    		$(this).val(fontStr + tailStr);
    		// alert("pos:"  + pos+ "fontStr:"+fontStr + " tailStr" +tailStr )
    		// 假设是首次键入有效的数字button,则默认填充兴许的时间。
    		if($(this).val().length==0){
    			$(this).val($(this).val()+"0:00");
    		}
    		$(this).position(pos);
    
    		if($(this).position()==5){
    			$(this).position(0);
    		}
    		
    
    	} else if((e.keyCode>=37 && event.keyCode<40) || event.keyCode==9){ //方向键不禁用
    	
    	}else{ //其他键禁用
    		return false;
    	}
    }
    
    /* 
    *	按键的第三个触发事件,此时的value是输入之后的
    *	
    */
    function inputTimeKeyup(e){
    	if($(this).position()==5){ 
    		//$(this).position(0);
    	}
    }


    备注:

    此应用在某些输入法的中文状态无法输入(如谷歌输入法),须要切换至英文(可是ie浏览器通过样式禁用输入法的方式也没有问题)。

  • 相关阅读:
    CSS印象不深的小地方
    gulp常用插件的使用
    移动端手势库Hammer.js—增强touch事件或手势
    HTML5拖放与文件操作api,实现拖拽上传文件功能
    Less相关
    gulp使用(一)
    将博客搬至CSDN
    jquery Ajax 通过jsonp的方式跨域提交表单
    解决“The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path”问题
    使用eclipse4.5创建maven项目
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4469676.html
Copyright © 2011-2022 走看看