onblur的死锁和解决方案
来源:互联网 发布:jdbc怎么连接数据库 编辑:程序博客网 时间:2024/05/17 22:53
在表单的验证中,为了做到强验证,许多人会将验证域绑定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窗口间的死锁。
- onblur的死锁和解决方案
- js的onblur和onfocus
- onblur和onfocus的区别
- GCD导致死锁的原因和解决方案
- 线程死锁和解决方案
- onblur, onchange和onpropertychange之间的区别
- 多线程程序中死锁的分析和解决方案(转)
- 多线程程序中死锁的分析和解决方案
- OC中GCD导致死锁的原因和解决方案
- 多线程程序中死锁的分析和解决方案
- onblur和onclick的冲突解决原名:onBlur killing onClick but not if setTimeout is used
- Onfocur和Onblur重复触发问题解决方案(文本框onblur事件连续触发的问题)
- db2 死锁的一个解决方案
- onfoucs和onblur事件
- onfocus和onblur
- onblur()和onfocus()
- HTML onfocus和onblur
- onblur和onlick
- 2008------学会拒绝
- 全能打手,首推ShellExecute
- 能让人喷饭的百度知道问答
- fjnu 1167 The 3n + 1 problem
- log4net1.2.10 在asp.net 2.0当中的使用
- onblur的死锁和解决方案
- Win2003下關於打印水晶報表沒有權限與報表按鈕不顯示的問題
- fjnu 1156 粗心的物理学家
- PhpMyadmin超重数据导入zt
- 新公司的异常回滚处理
- fjnu 1002 Factorial
- fjnu 1307 阶乘结果末尾有多少零
- fjnu 1761 star55的难题
- 软件外包过程中,合作双方的博弈(一)-谁更有优势