在表单的验证中,为了做到强验证,许多人会将验证域绑定onblur事件:
var
notis
=
[notis0,notis1,....]
//
提示信息
function validate(patten) ... {
if(this.value.test(patten)...{ //patten为验证正则表达式。
this.focus();
this.select();
return notis[i];
}
}
function validate(patten) ... {
if(this.value.test(patten)...{ //patten为验证正则表达式。
this.focus();
this.select();
return notis[i];
}
}
但这种绑定有些问题,当两个以上的域同时使用这种绑定时,会造成死锁。
假设域A和域B都绑定了上述事件,当焦点从A转移到B时,触发了A的onblur事件,并试图把焦点从B转移到A,并触发了B的onblur事件,于是就......死锁啦。
解决这个问题的方案有两个:
一是把强提示改为温和提示,改为绑定onchange事件。
二是判断其他域是否已经获得焦点。
var
otherElementFocusing
=
function
()
...
{
var focusing = false;
var eles = document.getElementsByTagName("INPUT");
for(var i=0;i<eles.length;i++)
if(eles[i].onblurChanged)focusing = true;
eles = document.getElementsByTagName("TEXTAREA");
for(i=0;i<eles.length;i++)
if(eles[i[.onblurChanged)focusing = true;
return focusing;
}
var focus = function (ele) ... {
if(otherElementFocusing()||getVisib(ele)== "hidden")return;//getVisib:获得display和visibility
if(!ele.onblurChanged)...{
ele.onblurChanged = true;
if(!ele.onblur)...{
ele.select();
ele.focus();
ele.onblur = function()...{ele.select();ele.focus()}
}else ...{
ele.oldOnblur = ele.onblur;
ele.onblur = ele.onblur.bindBefore(function()...{ele.select();ele.focus()});
}
}
}
var unfocus = function (ele) ... {
if(getVisb(ele)!="hidden"&&ele.onblurChanged)...{
if(ele.oldOnblur)ele.onblur= ele.oldOnblur;
else ele.onblur = "";
ele.onblurChanged = false;
}
}
var focusing = false;
var eles = document.getElementsByTagName("INPUT");
for(var i=0;i<eles.length;i++)
if(eles[i].onblurChanged)focusing = true;
eles = document.getElementsByTagName("TEXTAREA");
for(i=0;i<eles.length;i++)
if(eles[i[.onblurChanged)focusing = true;
return focusing;
}
var focus = function (ele) ... {
if(otherElementFocusing()||getVisib(ele)== "hidden")return;//getVisib:获得display和visibility
if(!ele.onblurChanged)...{
ele.onblurChanged = true;
if(!ele.onblur)...{
ele.select();
ele.focus();
ele.onblur = function()...{ele.select();ele.focus()}
}else ...{
ele.oldOnblur = ele.onblur;
ele.onblur = ele.onblur.bindBefore(function()...{ele.select();ele.focus()});
}
}
}
var unfocus = function (ele) ... {
if(getVisb(ele)!="hidden"&&ele.onblurChanged)...{
if(ele.oldOnblur)ele.onblur= ele.oldOnblur;
else ele.onblur = "";
ele.onblurChanged = false;
}
}
这样可以从onblur和focus的循环中解脱出来。
方法二的使用需要注意的是,验证提示方法不要使用alert。道理同上,alert后,点击确定也会触发验证域的onblur事件,造成验证域与alter窗口间的死锁。