Safari和Chrome浏览器中的对象焦点问题

8

我有以下javascript代码,在页面加载时请求焦点。

这段代码在Firefox和IE7中完美运行,但在Chrome和Safari中似乎根本不移动焦点。如何使它在所有浏览器中都正常工作?

 document.getElementById("MyFlashFile").focus();

这在当前版本的Chrome for Windows(版本28.0.1500.72 m)中仍然无法正常工作,提供的解决方法也都不起作用。 - Josh
5个回答

16

我花了几个小时在互联网上搜索,最终找到了一个解决方案,可以在IE、Firefox、Chrome和Safari的最新版本上运行。 以下代码可以彻底解决这个问题:

<head>
  <script type="text/javascript" src="swfobject.js"></script>
  <script>
    function setFocusOnFlash() {
      var f=swfobject.getObjectById('myFlashObjectId');
      if (f) { f.tabIndex = 0; f.focus(); }
    }
  </script>
</head>
<body onload="setFocusOnFlash()">

这个示例假设使用SWFObject库嵌入了Flash。如果没有,请将变量f设置为包含Flash动画的对象或嵌入标记。

于2012年5月5日编辑:不幸的是,似乎tabIndex的解决方法不再适用于所有浏览器(Chrome / Safari)和操作系统的组合。 例如,当前Windows上的Chrome 18会失败。

请参见下面提供的链接,由Christian Junk提供,以获取问题解决的状态。


这对我不起作用。getObjectById()指定的ID是什么?是通过attributes.id或swfobject.embedSWF()调用的第二个参数提供给swfObject的ID吗? - BadmintonCat
Silva你的解决方案太棒了!我已经寻找这个问题的解决方案好几个月了。终于找到了,感谢你的帖子。-Chris - cnanders
对我也不起作用。 作为测试,我尝试在if语句中放置一个警报。 警报确实显示出来,但是闪存没有聚焦。 我还尝试创建了一个只有文本框(没有闪存)的简单页面,并将焦点设置为该文本框,在那里确实起作用,但是对于闪存页面则不起作用。 我还尝试使用document.getElementById而不是swfobject.getObjectById,结果仍然相同。 因此,看起来还有其他问题,因为我们知道focus()函数确实起作用并被调用。 这在IE和FF中都有效,但在Chrome或Safari中无效。 有什么建议吗? - Travesty3
如下所述,正如@Tim TJey Jun所提到的那样,要使其在Chrome 12中起作用,您需要添加params.wmode =“opaque”;。对我来说,在Chrome和IE中它就能完美地工作了,但是FF和Safari比以前更糟糕了。现在,无论您是否单击文本字段,都无法键入任何内容。我想我可以进行浏览器检查,只为Chrome设置该参数,但如果有更好的解决方案,我真的很想知道。 - Travesty3
我把代码放在那里,它会闪烁但不会给予键盘焦点。 - Marcelo Noronha

4

4
很遗憾,无法保证在所有浏览器中都能设置焦点到Flash文件。IE和Firefox已经解决了这个问题(大多数情况下),但Chrome和Safari都基于Webkit,而它没有解决方案。
如果你曾经在YouTube或其他视频/Flash网站上注意到,你看到的第一件事是鼓励你点击播放器的东西,那就是由于这个问题。
有一个开发者想出了一个巧妙的解决方法,但它确实涉及向Flash文件添加一些ActionScript,如果你正在构建通用播放器,这可能会很麻烦。
Gary Bishop: 修复Firefox Flash愚蠢问题 另一种解决方案是将wmode设置为opaque。我听说这在某些情况下有效,但会破坏文本区域中的光标。我也没有太多的运气,但你可以试试。
你可以在Bugzilla上找到关于无焦点错误的更多信息。

Adam,看一下Cláudio Silva下面的解决方案。它对我有用 :)。 - Anvaka

1
除了Cláudio Silva的回答之外,您还需要设置wmode="opaque"

0

确保在整个页面渲染完成后调用此代码。它可能被调用到它所引用的HTML之上,因此该元素尚不存在。

各种JavaScript框架都有工具来告诉您DOM何时准备就绪


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接