我的页面中有一个Flash应用程序,当用户与Flash应用程序交互时,浏览器/ html / javascript停止接收键盘输入。
例如,在Firefox中,control-t不再打开新标签页。
但是,如果我点击非闪存的部分页面,浏览器会再次开始接收这些事件。
无论如何以编程方式(通过flash或javascript)将焦点返回到浏览器?
用户点击flash中的按钮后,我让flash执行了一个javascript回调,所以我尝试通过javascript将焦点放到表单字段(和正文),但这种方法似乎不是工作
一个更具体的例子是Youtube。他们也有这个问题。当我单击播放/暂停按钮或调整音量时,我希望我的浏览器键盘控制仍然有效,但他们没有,我必须单击电影区域外的页面上的某个位置。这是我正在努力解决的确切问题。
答案 0 :(得分:6)
您可以使用Flash中的ExternalInterface类来调用JavaScript。例如,你可以在一个区间(例如Event.ENTER_FRAME)上设置一个函数来调用@Diodeus提到的JavaScript函数:
document.body.focus();
或者,更好的解决方案是将事件监听器添加到flash根(阶段)以监听鼠标何时离开Flash。您可以设置此事件以将焦点移动到document.body。
AS3
package {
import flash.display.*;
import flash.events.*;
import flash.external.ExternalInterface;
public class TestMouseLeave extends Sprite
{
public function TestMouseLeave()
{
// Add event listener for when the mouse LEAVES FLASH
addEventListener(MouseEvent.MOUSE_OUT, onMouseLeave);
}
private function onMouseLeave(ev:Event):void
{
var jslink = new ExternalInterface();
jslink.call("changeFocus");
}
}
}
您网页上的Javascript:
<script type="text/javascript" language="javascript">
function changeFocus(){
document.body.focus();
}
</script>
如果你想要一个AS2示例,请告诉我,我会发布它。
想要记下这个解决方案:一旦将焦点推回浏览器,您将需要用户再次单击Flash插件以激活Flash插件内的用户输入。这可能是一种刺耳的用户体验,在使用此解决方案时需要考虑。
答案 1 :(得分:3)
我认为Adobe需要在鼠标离开其客户区时放弃焦点,或者提供一个选项。
但是我认为大多数Flash开发人员(尤其是制作游戏的人)都依赖于闪存应用程序捕获键盘输入这一事实,无论鼠标位于何处。
答案 2 :(得分:2)
在Firefox中,document.body.focus();
不起作用。使用与CláudioSilva对此Chrome issue的解决方案相同的想法,以下JavaScript将适用于Firefox:
document.body.tabIndex = 0;
document.body.focus();
答案 3 :(得分:0)
您可以通过在HTML页面上调用geturl来调用javascript来将焦点返回到浏览器:
document.body.focus()
如何在Flash电影中执行此操作取决于用户与电影的互动方式。您可以继续在计时器上执行此操作,或者当控件失去焦点或鼠标移动时。这取决于。
答案 4 :(得分:0)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script>
<![CDATA[
private function init():void {
i.setFocus();
this.addEventListener(KeyboardEvent.KEY_UP,keyPressed);
}
private function keyPressed(event:KeyboardEvent):void {
if(event.keyCode.toString()=="84" && event.ctrlKey==true)
ExternalInterface.call('newtab');
}
]]>
</mx:Script>
<mx:TextInput x="23" y="268" width="256" id="i" text="Text Box"/>
</mx:Application>
<script type="text/javascript">
function newtab(e){
document.body.focus();
window.open('about:blank');
}
</script>
现在,其他键盘会发生什么?是T的84标准?我喜欢焦点的想法,但在完整的浏览器应用程序中,没有多少空间可以失去焦点。 用户也可以更改密钥组合,我认为这些不是一个完整的修复程序,如果没有flash从浏览器轮询命令配置,然后听我们基本上在这里做的组合。我不知道。
这也只是在给予焦点后尝试打开一个新窗口,让用户按下它两次没有任何意义,除非它们像弹出窗口一样阻止窗口。但首先要关注焦点,如果发生这种情况,则第二次尝试应该起作用。如果需要,您可以在浏览器应用中提醒用户。
答案 5 :(得分:0)
如果有人需要,下面有一个解决方案。对我来说,这很有效。我可以点击我的Flash但仍然使用所有浏览器键盘功能(当在Flash中点击时焦点转移到html部分)。