Flash窃取浏览器焦点

时间:2008-10-31 16:28:37

标签: javascript html flash

我的页面中有一个Flash应用程序,当用户与Flash应用程序交互时,浏览器/ html / javascript停止接收键盘输入。

例如,在Firefox中,control-t不再打开新标签页。

但是,如果我点击非闪存的部分页面,浏览器会再次开始接收这些事件。

无论如何以编程方式(通过flash或javascript)将焦点返回到浏览器?

用户点击flash中的按钮后,我让flash执行了一个javascript回调,所以我尝试通过javascript将焦点放到表单字段(和正文),但这种方法似乎不是工作

一个更具体的例子是Youtube。他们也有这个问题。当我单击播放/暂停按钮或调整音量时,我希望我的浏览器键盘控制仍然有效,但他们没有,我必须单击电影区域外的页面上的某个位置。这是我正在努力解决的确切问题。

6 个答案:

答案 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部分)。

http://forums.adobe.com/message/3431403#3431403