日期:2014-05-16 浏览次数:20407 次
在表单验证时,输入框的验证经常会用到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.onload=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').onblur=blur;
$('text2').onblur=blur;
}
//-->
</SCRIPT>
</head>
<body>
<input type="text" id="text1"/>
<input type="text" id="text2"/>
</body>
</html>
?