IE下,focus()无效的问题

metaphy 2008-01-11 08:56:19
因为原理知识或实践经验缺乏的缘故,编码过程中,常常会遇到这种问题;这问题像座大山似的,横亘在你面前,让你苦思不得其解;而一旦解决,无论是自己解决还是别人帮你解决的,那种轻松与愉悦也是常人难以体会的。

今天,一个IE7(包括IE6)下焦点的无法set的问题(Firefox下没有问题),试了一下午,拼命的试拼命的试拼命的试,就是不成功。基本流程是这样:
1.有个单独的层(xDiv),实现一个对话框似的东西
2.通过ajax操作,返回不同的input(radio,select等),写在层上(用xDiv.innerHTML="<input type='text'..."实现)
3.给该层上的input框set focus,使用 setTimeout("document.getElementById('xxx_input').focus();", 50);

症状:
Firefox下完全没问题,Safari下完全没问题,IE7、IE6有的对话框返回有问题,有的没有问题。

查了一下,hax说(http://www.javaeye.com/topic/94825):
引用

当时焦点本在你的input里,所以你append之后,首先会被remove,焦点就消失了。那么ie要把焦点重置到某个地方的,比如它的parentNode。而你直接调用focus方法是在重置之前,就可能不起作用了。

问题的关键是ie的焦点不仅有浏览器自身逻辑焦点,而是会被映射到windows控件焦点。两者的同步是存在一定问题的,因此ie经常会出现一些奇怪的丢焦点问题。例如你开启着输入法的时候点击一个vml图像,焦点就会消失,此时你可以输入一些汉字看看发生什么奇怪的事情,呵呵。

所以hexiaodong的方法就起作用了。推而广之,许多时候碰到奇怪问题,延时可以解决问题。

不过这并不是说dom操作不是即时生效。dom操作确实都是同步的。但是因dom改变而触发的事件,以及其他一些效应(例如样式应用),很可能是异步的。

他提到的延时可以解决问题,我这个延时也解决不了。但问题的根源总算有点眉目,就是IE采用windows控件自身焦点的问题。
...全文
1662 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
metaphy 2008-01-14
  • 打赏
  • 举报
回复
解决,感谢楼上诸位的回复。
if(document.getElementById('text_xxx')) {
if (IS_IE){
document.getElementById('text_xxx').value = " ";
document.getElementById('text_xxx').focus();
document.getElementById('text_xxx').value = "";
document.getElementById('text_xxx').select();
}else{
document.getElementById('text_xxx').focus();
}
}
nj_1st_excellence 2008-01-12
  • 打赏
  • 举报
回复
document.getElementById('xxx_input').select() 试验下
he_8134 2008-01-12
  • 打赏
  • 举报
回复
设置好的焦点会被后来加载的控件夺取!!!
metaphy 2008-01-12
  • 打赏
  • 举报
回复
谢谢楼上几位,"保证document.getElementById('xxx_input')一定可以找到";这个已经加上判断
nicholsky 2008-01-12
  • 打赏
  • 举报
回复
先判断元素存在再进行操作。
rjzou2006 2008-01-12
  • 打赏
  • 举报
回复
lz
-----------------
在设置focus()时对象存在且没有disabled=true;

就像yixianggao说的

保证document.getElementById('xxx_input')一定可以找到
yixianggao 2008-01-12
  • 打赏
  • 举报
回复
document.getElementById('xxx_input').focus();
执行成功滴前提是document.getElementById('xxx_input')可以找到!

lz怎么保证document.getElementById('xxx_input')一定可以找到?!
或者说在50毫秒后一定就能找到?!

不妨改为500再试试看!

50和500对于用户感受而言没差别,
对于cpu可是差了一个数量级!
he_8134 2008-01-11
  • 打赏
  • 举报
回复
我是说最好等页面元素全部加载完再设置焦点~~
这样才不会无缘无故被夺取焦点~
(手动或者是程序都会这样)
metaphy 2008-01-11
  • 打赏
  • 举报
回复
我在想,谁有类似的经历,可以提供一点意见
或指明具体问题所在
这里不能贴代码,因为代码太多了
he_8134 2008-01-11
  • 打赏
  • 举报
回复
有时候在输入文字的时候页面没有加载完~打着打着文本框就丢失焦点了~真的很讨厌~~
xiaolei1982 2008-01-11
  • 打赏
  • 举报
回复
哦,楼主想说明啥

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧