3

我有以下代码,在 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 键...就好像它不存在一样!!!

4

1 回答 1

5

解决了!!!

经过大量令人沮丧的测试后,我发现输入控件嵌套在一个 DIV 中,在某些情况下它被禁用,我愚蠢地禁用了一个 DIV。

...但是,所有其他浏览器仅在显式禁用输入控件时才实际禁用它。微软的那些总是试图“太聪明”的人决定采用一种连续的方法并让它完成了一半。

问题和我的抱怨是输入控件看起来并没有被禁用,它看起来很正常,如果你点击它,插入符号实际上会出现,你甚至可以在它上面输入,不管它应该是多么禁用......所以对于记录,永远记住 IE 10 只有一半禁用了禁用 DIV 内的输入控件,让您无法直观地了解正在发生的事情。

于 2013-09-03T01:17:44.267 回答