我有以下代码,可以在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()完成的,要动画的对象被添加到数组(Sys.Anim)并在动画结束时被移除。为了保持一切顺畅,如果在动画结束之前页面准备好输入(几乎总是发生),焦点()调用会延迟,直到动画结束,即大约1/3一秒钟。
除了IE 10之外,所有浏览器都能正常工作。起初我认为我的代码存在逻辑错误,但是我使用开发人员工具对其进行了调试,我发现所有步骤都正确执行,问题是 focus()实际上并不是一直都在工作。
另一个重要细节......当焦点()成功时 email.onkeydown 会在每次按键时执行,但是当 focus()失败我显然必须单击输入控件才能手动对焦,但是当发生这种情况时,即使输入控件的内容每次按键都更新,也不会调用 email.onkeydown 函数。
我试过:
setTimeout(function(){obj.focus()},100);
被提议作为解决这个问题的方法,但它并没有解决我的问题。
为什么会发生这种情况以及如何解决这个问题?
更新:
对于测试建议我添加了以下功能:
email.onfocus = function(){
debugger
}
只有在 focus()成功时才会调试器,如果 focus()失败,即使您手动聚焦输入控件,调试器也不会弹出点击鼠标,因为在这种情况下我无法通过使用Tab键或Shift-Tab键来聚焦输入控件...就好像它不存在一样!!!
答案 0 :(得分:5)
解决!!!
经过大量令人沮丧的测试后,我发现输入控件嵌套在DIV中,在某些情况下被禁用,对我来说,禁用DIV是愚蠢的。
...但是,如果显式禁用输入控件,则所有其他浏览器实际上仅禁用输入控件。微软总是试图“过于聪明”的人决定采取一种相似的方法并将其完成一半。
问题和我的投诉是输入控件看起来没有禁用,它看起来很正常,如果点击它就会实际显示插入符号,你甚至可以输入它,无论它如何禁用它应该是...所以为了记录,永远记住IE 10只有一半禁用输入控件,这些输入控件在禁用DIV内部,不会给你带来任何正在发生的视觉线索。