耗时输入框

前言:

在系统中有输入耗时的需求,用于描写叙述一个活动花费多少时间。
详细要求:
精确到分钟,仅仅同意录入小时和分钟,不同意输入不合法的字符,或者做对应的校验。
设计:
依据需求考虑使用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浏览器通过样式禁用输入法的方式也没有问题)。

转载于:https://www.cnblogs.com/gcczhongduan/p/4469676.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值