[js技巧]解决输入框焦点争夺

在表单验证时,输入框的验证经常会用到onblur事件,当验证不通过,有时会需要调用focus()把焦点移回输入框,就是不输对就不许其他操作那种,虽然应用场景不多,在实际使用时会产生一个焦点争夺的问题:

 

当两个输入框里都是验证不通过的值,焦点在a输入框,当用户点击b输入框时,a输入框的onblur验证方法调用focus()方法触发b输入框的onblur事件,又会要求把焦点设置到b上两个输入框的onblur事件轮流触发,造成焦点争夺死锁.

 

以下示例通过增加一个标志控制事件的执行,并通过setTimeout置回标志,让onblur事件先触发.

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title> new document </title>
<SCRIPT LANGUAGE="JavaScript">
<!--
	window.οnlοad=function(){
		var $=function(s){return document.getElementById(s)}
		var blur=function(){
			var disableEvent=false;
			return function(){
				if(disableEvent)return;
				var that=this;
				alert(1)
				disableEvent=true;
				if(navigator.userAgent.indexOf("Firefox")>0){//ff浏览器focus要在blur之后才能有效调用,onblur相当于onbeforeblur,所以需要setTimeout方法
					setTimeout(function(){that.focus()},0);
				}else{
					this.focus();
				}
				setTimeout(function(){disableEvent=false;},0);
			}
		}()

		$('text1').οnblur=blur;
		$('text2').οnblur=blur;
	}
//-->
</SCRIPT>
 </head>

 <body>
  <input type="text" id="text1"/>
  <input type="text" id="text2"/>
 </body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值