离开浏览器并返回时Applet会永久丢失焦点

时间:2010-11-04 00:02:10

标签: java javascript swing browser applet

我有一个网页,其中applet是唯一看起来像这样的元素:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <title>...</title>
</head>
<body>
<applet style="padding:1px; border:1px solid gray" mayscript="mayscript" codebase="..." name="AppletName" code="..." archive="..." width="600" height="500" alt="Alt Text">
  <param name="initial_focus" value="true"/> 
   Alt Text
</applet>
</body>
</html>

当页面最初加载时,焦点在applet中设置,我可以选中并与applet进行交互。但是,如果我离开浏览器窗口然后再回到它,我就不能再使用tab键重新关注applet了。

按F5重新加载页面会修复页面,以便Applet重新获得焦点,但此解决方案是不可接受的。

我该如何解决这个问题?感谢。

1 个答案:

答案 0 :(得分:0)

暂定解决方案:

//Dean Edwards/Matthias Miller/John Resig
function init() {
  // quit if this function has already been called
  if (arguments.callee.done) return;

  // flag this function so we don't do the same thing twice
  arguments.callee.done = true;

  // kill the timer
  if (_timer) clearInterval(_timer);

  window.onfocus = function() {
    if(!document.AppletName.isActive())
      document.AppletName.requestFocus();
  };
}

/* for Mozilla/Opera9 */
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
  document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
  var script = document.getElementById("__ie_onload");
  script.onreadystatechange = function() {
    if (this.readyState == "complete") {
      init(); // call the onload handler
    }
  };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
  var _timer = setInterval(function() {
    if (/loaded|complete/.test(document.readyState)) {
      init(); // call the onload handler
    }
  }, 10);
}

/* for other browsers */
window.onload = init;

请注意,用于检测applet是否需要关注并且如果是这样请求它的关键部分(这仅在启用mayscript时有效):

if(!document.AppletName.isActive())
  document.AppletName.requestFocus();

其余代码只是在页面加载后附加焦点处理窗口(使用JQuery.ready基于脚本)。

欢迎更好的解决方案。