2008-10-31 10 views
16

Mam aplikację flash na mojej stronie, a kiedy użytkownik wchodzi w interakcję z aplikacją flash, przeglądarka/html/javascript przestaje otrzymywać dane z klawiatury.Flash kradnie ogniskowanie przeglądarki

Na przykład w przeglądarce Firefox-t nie otwiera już nowej karty.

Jeśli jednak kliknę część strony, która nie jest flashowana, przeglądarka ponownie zacznie otrzymywać te zdarzenia.

Czy mimo to programuje się (za pomocą flash lub javascript), aby zwrócić fokus do przeglądarki?

Po tym, jak użytkownik kliknie przycisk w flash, mam flash wykonujący wywołanie zwrotne javascript, więc próbowałem skupić się na polu formularza (i na ciele) przez javascript, ale to podejście nie wydaje się pracować.

Być może bardziej konkretnym przykładem jest Youtube. Mają także ten problem. Kiedy klikam przycisk odtwarzania/pauzy lub reguluję głośność, spodziewałbym się, że moje elementy sterujące klawiatury nadal będą działać, ale nie muszą, muszę kliknąć gdzieś na stronie poza obszarem filmu. To jest dokładny problem, który próbuję rozwiązać.

Odpowiedz

3

Uważam, że Adobe musi odejść od tematu, gdy mysz wychodzi z obszaru roboczego lub udostępniać opcję.

Jednak myślę, że większość programistów Flash (a zwłaszcza tych, którzy tworzą gry) polega na tym, że wejście klawiatury jest przechwytywane przez aplikację flash, niezależnie od tego, gdzie znajduje się mysz.

0

Możesz powrócić ostrość do przeglądarki wykonując getURL może nazywając JavaScript na stronie HTML:

document.body.focus() 

Jak to zrobić w filmie Flash będzie zależała od sposobu interakcji użytkownika z pracami filmowymi . Możesz to robić na czasomierzu lub gdy kontrolka straci ostrość lub gdy mysz się poruszy. To zależy.

5

Możesz użyć klasy ExternalInterface w programie Flash, aby wywołać JavaScript. Na przykład można skonfigurować funkcję na przedziale (Event.ENTER_FRAME na przykład), aby wywołać funkcję JavaScript, która @Diodeus wymienić:

document.body.focus(); 

Lub, jeszcze lepszym rozwiązaniem byłoby, aby dodać detektor zdarzeń do flash root (etap) do słuchania, gdy mysz opuści Flash. Możesz skonfigurować to wydarzenie, aby przenieść fokus do dokumentu .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 na swojej stronie:

<script type="text/javascript" language="javascript"> 
    function changeFocus(){ 
     document.body.focus(); 
    } 
</script> 

Daj mi znać, jeśli chcesz przykład AS2 i wyślę go.

Chcieliśmy zanotować to rozwiązanie: Po ponownym ustawieniu ostrości w przeglądarce konieczne będzie ponowne kliknięcie wtyczki Flash, aby aktywować dane wprowadzane przez użytkownika we wtyczce flash. Może to być kłopotliwe doświadczenie użytkownika i należy wziąć to pod uwagę podczas korzystania z tego rozwiązania.

+0

Nice one! Nie znam ani trochę Flasha (i nie chcę, płyta jest pełna ;-), więc to jest jedna z ciekawszych informacji, będę masowo wysyłać wiadomości do Flash'erów, które znam! –

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>  

Co się dzieje z innymi klawiaturami? jest 84 standardem dla T?Podoba mi się pomysł na fokus, ale w aplikacjach z pełną przeglądarką nie ma tyle miejsca, by stracić koncentrację. Użytkownik może również zmienić kombinację klawiszy, nie sądzę, że jest to kompletna poprawka dla tej wersji bez flashowania przez polecenie config z przeglądarki, a następnie odsłuchiwania combo, tak jak tutaj w zasadzie robimy. Nie wiem.

To również próbuje otworzyć nowe okno po ustawieniu ostrości, nie ma dla mnie sensu zmuszanie użytkownika do dwukrotnego kliknięcia, chyba że zablokuje to okno jak wyskakujące okienko. Ale fokus nazywa się najpierw, więc jeśli tak się stanie, druga próba powinna zadziałać. W razie potrzeby możesz powiadomić użytkownika w przeglądarce.

2

W przeglądarce Firefox, document.body.focus(); nie działa. Stosując ten sam pomysł jako rozwiązanie Cláudio Silva do tego Chrome issue następujące JavaScript działa w Firefox:

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

Jest to rozwiązanie poniżej przypadek ktoś potrzebuje. Dla mnie to działa całkiem nieźle. Mogę klikać wokół Flasha, ale nadal używam całej funkcjonalności klawiatury przeglądarki (ostrość zostaje przesunięta do części html po kliknięciu wewnątrz Flasha).

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