【问题标题】:How do I make my flash object get focus on load?如何让我的 flash 对象专注于负载?
【发布时间】:2011-10-27 20:04:57
【问题描述】:

我一直在尝试为我的 Flash 游戏设置此测试页面,但它拒绝关注负载。我阅读了一堆论坛条目并没有让它做任何事情,我真的不敢相信这应该这么难。

这是我所拥有的:

  <head>
<title>UP HERE WE ESCAPE THE RAT RACE</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
    swfobject.embedSWF("UpHere.swf", "myContent", "700", "300", "9.0.0");

    function setFocusOnFlash() { 
    var fl = document.getElementById("myContent"); 
      if (fl) { fl.focus(); } 
    } 
</script>
  </head>
  <body  onload="setFocusOnFlash()">
  <div style="margin:0 auto; text-align:center; width:700px;">
    <div id="myContent" style="margin:0 auto; text-align:center; width:700px;">
      <p>Alternative content</p>
    </div>
     </div>
      </body>

你可以在这里看到它, http://joon.be/exclusivepreview/

它有什么问题? 我对 swfObject 的了解不是很深...

【问题讨论】:

    标签: html flash


    【解决方案1】:

    我找到了一种适用于 Firefox 16、Chrome 23 和 IE 8 的方法(这些是我迄今为止测试过的地方)。当然,这是一堆 hack,所以谁知道它是否会永远有效……但它肯定不会让事情变得更糟。

    function setFocusOnFlash() {    
        var flash = document.getElementById("theIdOfTheObjectElement");
        flash.tabIndex = 1234;  // This was needed on Chrome 23
        flash.focus();
        // Attention: FireFox needs wmode "opaque"!
    }
    

    仅在 Firefox 上,object 元素下的&lt;param name="wmode" value="opaque"&gt; 也是必需的,否则focus() 无效。 (我使用了 Stephen Belanger 的jquery.flash,您可以在其中指定wmode;我认为SWFObject 也可以。)

    但更棘手的部分是您不能过早致电setFocusOnFlash。对于 Chrome 和 IE,在插入对象的 JavaScript 之后直接添加 setTimeout(setFocusOnFlash, 1) 已经生效。直接发出setFocusOnFlash() 没有。我认为诀窍很简单,即仅在浏览器完全处理文档更改后才调用定时回调,而不管您指定的延迟如何。但是在 Firefox 上调用这个小延迟还为时过早。它在object 元素周围放置了一个虚线边框(它不应该这样做)并且Flash 没有得到击键。将延迟设置为 250 已在我的计算机上解决了此问题,但谁知道您需要多大的延迟。 (更糟糕的是,重复 setFocusOnFlash 调用也无济于事......一旦出现虚线边框,它们就没有进一步的效果。)所以,我所做的是向 flash 添加一个 ExternalInterface.call("flashLoaded") 回调 文档类构造函数。需要明确的是,您在 Flash/ActionScript 中执行此操作,因此您需要访问源代码或 SWF 文件的作者。这样,当 SWF 启动时,它会调用嵌入 HTML 页面的 flashLoaded JavaScript 方法,因此您知道它已准备就绪。函数是这样的:

    function flashLoaded() {
        // Oddly, directly calling setFocusOnFlash() didn't work on IE8
        setTimeout(setFocusOnFlash, 1);
    }
    

    【讨论】:

      【解决方案2】:

      The way to do this is to use ExternalInterface and send the focus to Flash using a JS listener on the tab event (i.e. as the tab moves away from the element before Flash).在实践中,这很难,并且 AS 中的 stage.focus 处理需要处理一些 erm 怪癖。但它确实可以跨浏览器工作

      【讨论】:

        【解决方案3】:

        我迫切希望得到这项工作,只是为了加快我自己的 Flash 游戏开发速度,以避免每次都点击来测试我的游戏。所以我不在乎它是否适用于所有浏览器,所以这里只适用于 Chrome。

        <body onload='document.getElementById("haxe").focus();'>
            <embed src="game.swf" id="haxe" ...
        

        如果您之前尝试过 focus() 并且它对您不起作用,请注意您必须只使用 embed 标记,而不是对象和参数版本。

        在 Chrome 版本 40.0.2214.93(64 位)上测试。

        【讨论】:

          【解决方案4】:

          您使用的方法仅适用于 Internet Explorer - 这是 Flash 使用方式的限制。

          http://kb2.adobe.com/cps/155/tn_15586.html

          【讨论】:

          • 有什么方法可以用 Chrome 和其他浏览器做到这一点,或者说自动对焦闪光灯不是你应该/可以做到的?
          • 可能有办法,但我肯定还没想出来。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          • 1970-01-01
          • 2020-03-31
          • 2012-08-09
          • 1970-01-01
          • 1970-01-01
          • 2016-08-22
          相关资源
          最近更新 更多