我一直在尝试为我的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没有很深的了解......
答案 0 :(得分:6)
我找到了一种适用于Firefox 16,Chrome 23和IE 8的方法(这些是我到目前为止测试过的地方)。当然,这是一堆黑客,所以谁知道它是否会永远有用......但它肯定不会让事情变得更糟。
function setFocusOnFlash() {
var flash = document.getElementById("theIdOfTheObjectElement");
flash.tabIndex = 1234; // This was needed on Chrome 23
flash.focus();
// Attention: FireFox needs wmode "opaque"!
}
仅在Firefox上,还需要<param name="wmode" value="opaque">
元素下的object
,否则focus()
无效。 (我使用了Stephen Belanger的jquery.flash
,您可以在其中指定wmode
;我认为SWFObject
也可以。{/ p>
但更棘手的部分是你不能太早致电setFocusOnFlash
。对于Chrome和IE,在插入对象的JavaScript之后直接添加setTimeout(setFocusOnFlash, 1)
。直接签发setFocusOnFlash()
没有。我假设诀窍很简单,只有在浏览器完全处理文档更改后才会调用定时回调,无论您指定的延迟如何。但是对于这种小延迟的Firefox呼叫还为时过早;它在object
元素周围放置了一个虚线边框(它不应该),Flash没有得到击键。将延迟设置为250已在我的计算机上修复此问题,但谁知道您需要多大的延迟。 (更糟糕的是,重复setFocusOnFlash
调用也没有帮助......一旦那个虚线边框存在,它们就没有进一步的效果了。)所以,我所做的是将ExternalInterface.call("flashLoaded")
回调添加到 flash 文档类构造函数。为了清楚起见,您可以在Flash / ActionScript中执行此操作,因此您需要访问SWF文件的源或作者。这样,当SWF启动时,它会调用嵌入HTML页面的flashLoaded
JavaScript方法,因此您知道它已准备就绪。功能如下:
function flashLoaded() {
// Oddly, directly calling setFocusOnFlash() didn't work on IE8
setTimeout(setFocusOnFlash, 1);
}
答案 1 :(得分:1)
执行此操作的方法是使用ExternalInterface并使用标签事件上的JS侦听器将焦点发送到Flash(即,当选项卡远离Flash之前的元素时)。在实践中,它很难,你的AS中的stage.focus处理需要处理一些,呃,怪癖。但它确实可以跨浏览器工作
答案 2 :(得分:1)
我迫切希望得到这项工作,只是为了加快我自己的Flash游戏开发,以避免每次都点击来测试我的游戏。所以我不在乎它是否适用于所有浏览器,所以这里只适用于Chrome。
<body onload='document.getElementById("haxe").focus();'>
<embed src="game.swf" id="haxe" ...
如果您之前尝试过focus()并且它不适合您,请注意您只需使用嵌入标记,而不是对象和参数版本。
在Chrome版本40.0.2214.93(64位)上测试。
答案 3 :(得分:0)
您使用的方法仅适用于Internet Explorer - 这是闪存使用方式的限制。