Miller同学发现的IE6 bug:如以下代码,点击textarea时,引发window的blur,导致focus与blur配对混乱:

<body>
<textarea></textarea>
hello
<script>
window.onblur
=function(){
document.title
= 'blur:' + Math.random() ;
}
window.onfocus
=function(){
document.title
= 'focus:' + Math.random() ;
}
</script>
</body>

这应该是一个很常见的需求,例如,当前窗口定期更新数据,而窗口失焦则减少信息更新频率。IE6的bug导致的配对混乱却会打乱我们的计划。

上网查也没查出关于这个bug的官方说明也推荐解决方案,只好自己生更的实现一个解决方案。

代码如下:

<body>
<textarea></textarea>
hello
<script>
(
function(){
var focusTimer = 0;
function myBlur(){
document.title
= 'blur:' + Math.random() ;
}
function myFocus(){
clearTimeout(focusTimer);
focusTimer
= setTimeout(function(){
document.title
= 'focus:' + Math.random() ;
},
10);
}
window.onfocus
= document.body.onfocusin = myFocus;
window.onblur
= document.body.onfocusout = myBlur;
}());
</script>
</body>

大略原理是:找到很多可能触发onfocus与onblur的时机,所有的onblur都立即执行,而onfocus则延时10毫秒懒惰执行。

结果是:虽说有时多执行了几次myFocus与myBlur,但能保证窗口状态的正确性。

方法可能有点山寨,不过一时没想到更好的办法,这样也暂时能解个燃眉之急。

作者: JKisJK 发表于 2011-07-29 21:29 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"