2008-10-31 139 views
16

我在我的頁面中有一個Flash應用程序,當用戶與Flash應用程序交互時,瀏覽器/ html/javascript停止接收鍵盤輸入。Flash竊取瀏覽器焦點

例如,在Firefox控制-t不再打開一個新的選項卡。

但是,如果我點擊非閃存頁面的一部分,瀏覽器就會再次接收這些事件。

是否有編程方式(通過Flash或JavaScript)返回焦點到瀏覽器?

用戶在Flash中點擊一個按鈕後,我有Flash執行一個JavaScript回調,所以我試圖通過JavaScript給焦點的表單字段(和身體),但這種做法似乎並沒有正在工作。

也許更具體的例子是Youtube。他們也有這個問題。當我點擊播放/暫停按鈕或調整音量時,我希望我的瀏覽器鍵盤控制仍可以工作,但它們不會,我必須在電影區域外的頁面上點擊某處。這是我試圖解決的確切問題。

回答

3

我認爲Adobe需要在鼠標離開其客戶區域時放棄焦點,或者提供一個選項。

但是我認爲大多數Flash開發人員(特別是製作遊戲的開發人員)都依賴於鍵盤輸入被Flash應用程序捕獲而不管鼠標位於何處。

0

你可以做的getURL可以調用HTML頁面的JavaScript將焦點返回到瀏覽器:

document.body.focus() 

你如何在Flash影片做到這一點,將取決於如何與電影作品的用戶交互。您可以繼續使用定時器,或者當控件失去焦點時,或者鼠標移動時。這取決於。

5

您可以使用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插件內的用戶輸入。這可能是一個令人震驚的用戶體驗,並且在使用此解決方案時需要考慮。

+0

不錯!我不知道有一點Flash(而且不想,盤子已滿;-),所以這是一個代碼,我會集體郵寄任何Flash'er我知道的一小撮! – 2010-03-04 20:23:50

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標準嗎?我喜歡關注焦點的想法,但在完整的瀏覽器應用程序中,沒有太多空間可以失去焦點。 用戶也可以更改組合鍵,我不認爲這些對於這個沒有太多的完整修復,沒有從瀏覽器輪詢命令配置,然後聽我們基本上在這裏做的組合。我不知道。

這也只是試圖打開一個新的窗口後給予焦點,沒有意義讓我按兩次,除非他們阻止像彈出窗口的窗口。但重點首先被調用,如果發生這種情況,第二次嘗試應該起作用。如果需要,您可以在瀏覽器應用程序中提醒用戶。

2

在Firefox中,document.body.focus();不起作用。使用相同的思路克勞迪奧·席爾瓦的解決這個Chrome issue,下面的JavaScript在Firefox中使用:

document.body.tabIndex = 0; 
document.body.focus(); 
0

有以下的情況下,有人需要它的解決方案。對我而言,這很好地工作。我可以點擊我的Flash,但仍然使用所有瀏覽器鍵盤功能(焦點在Flash內單擊時轉移到html部分)。

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