任何人都可以解释为什么focus()总是在IE 10上不起作用?

时间:2013-08-30 14:35:53

标签: javascript internet-explorer

我有以下代码,可以在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键来聚焦输入控件...就好像它不存在一样!!!

1 个答案:

答案 0 :(得分:5)

解决!!!

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

...但是,如果显式禁用输入控件,则所有其他浏览器实际上仅禁用输入控件。微软总是试图“过于聪明”的人决定采取一种相似的方法并将其完成一半。

问题和我的投诉是输入控件看起来没有禁用,它看起来很正常,如果点击它就会实际显示插入符号,你甚至可以输入它,无论它如何禁用它应该是...所以为了记录,永远记住IE 10只有一半禁用输入控件,这些输入控件在禁用DIV内部,不会给你带来任何正在发生的视觉线索。