我有以下代码,在 Chrome 和 Safari 上可以 100% 正常工作,但在 IE 10 上有时可以工作,有时不能。
Sys.Focus = function(obj){
if(Sys.Anim.length>0){
Sys.Fp = obj;
return;
}
obj.focus();
}
.
.
.
function Animate(...){
var i,...
.
.
.
if(Finished(Sys.Anim[i])){
Sys.Anim.splice(i,1);
if(Sys.Anim.length==0){
if(Sys.Fp){
Sys.Focus(Sys.Fp)
Sys.Fp = null;
}
}
}
.
.
.
}
.
.
.
email = document.getElementById("email");
Sys.Focus(email);
email.onkeydown = function(){
debugger
.
.
.
}
为了响应不同的用户操作,屏幕上的一些对象要么改变颜色,要么移动,这是由 Animate() 完成的,要设置动画的对象被添加到 Array (Sys.Anim) 中,并在动画结束时移除。为了保持一切顺利,如果页面在动画结束之前准备好输入(这几乎总是发生),则focus()调用会延迟到动画结束,即大约 1/3 秒。
在除 IE 10 之外的所有浏览器中,一切都按预期工作。起初我以为我的代码存在逻辑错误,但是我使用开发人员工具对其进行了调试,发现所有步骤都正确进行,问题是焦点( )实际上并不是一直在工作。
另一个重要细节......当focus()成功时email.onkeydown每次我按下一个键时都会执行,但是当focus()失败时我显然必须单击输入控件以手动聚焦它,但是当这种情况发生时email.onkeydown即使每次按键都更新了输入控件的内容,函数也不会被调用。
我试过了:
setTimeout(function(){obj.focus()},100);
它被提议作为这个问题的解决方案,但它并没有解决我的问题。
为什么会发生这种情况以及如何解决?
更新:
对于测试建议,我添加了以下功能:
email.onfocus = function(){
debugger
}
仅在focus()成功时才带调试器,如果focus()失败,即使您通过鼠标单击手动聚焦输入控件,调试器也不会弹出,因为在这种情况下,我根本无法使用Tab 或 Shift-Tab 键...就好像它不存在一样!!!