2011-10-27 14 views
5

Próbowałem założyć tę stronę testową dla mojej gry flash, ale ona odmawia uzyskać ostrość na obciążenia. Czytałem kilka wpisów na forum i nic nie mogłem zrobić, nie mogę uwierzyć, że to powinno być takie trudne.Jak sprawić, aby mój obiekt Flash skupił się na obciążeniu?

Oto co mam:

<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> 

Można zobaczyć, że tu mieszkam, http://joon.be/exclusivepreview/

co się z nim stało? Nie mam bardzo głębokiej wiedzy na temat swfObject ...

Odpowiedz

6

znalazłem sposób, który pracuje dla mnie na Firefox, Chrome 16, 23 i IE 8 (są to gdzie ja testowałem go do tej pory). Oczywiście, jest to garstka hackerów, więc kto wie, czy zadziała na zawsze ... ale na pewno nie pogarsza sprawy.

function setFocusOnFlash() {  
    var flash = document.getElementById("theIdOfTheObjectElement"); 
    flash.tabIndex = 1234; // This was needed on Chrome 23 
    flash.focus(); 
    // Attention: FireFox needs wmode "opaque"! 
} 

On tylko Firefox, <param name="wmode" value="opaque"> pod elementem object również potrzebne, albo focus() nie miał wpływu. (Użyłem Stephen Belanger na jquery.flash, gdzie można określić wmode; zakładam, że to również możliwe z SWFObject.)

Ale trudniejsze jest to, że nie musi wywołać setFocusOnFlash zbyt wcześnie. Dla Chrome i IE, dodając setTimeout(setFocusOnFlash, 1) bezpośrednio po JavaScript, który wstawia obiekt pracował. Bezpośrednio wydawanie setFocusOnFlash() nie. Zakładam, że sztuczka polega po prostu na tym, że czasowe wywołania zwrotne są wywoływane tylko wtedy, gdy przeglądarka w pełni przetworzy zmianę dokumentu, niezależnie od określonego opóźnienia. Ale w Firefoksie dzwonienie z tym małym opóźnieniem było zbyt wcześnie; to umieścić obramowanie wokół elementu przerywana object (nie powinien) i Flash nie dostać klucz uderzeń. Ustawienie opóźnienia na 250 poprawiło to na moim komputerze, ale kto wie, jak duże opóźnienie jest potrzebne. (Co gorsza, powtórzenie wywołań setFocusOnFlash również nie pomogło ... Po tym, jak ta przerywana ramka tam była, nie miały one dalszego efektu.) Tak więc zamiast tego dodałem wywołanie zwrotne ExternalInterface.call("flashLoaded") do konstruktora klasy dokumentu. Aby było jasne, robisz to w języku Flash/ActionScript, więc potrzebujesz dostępu do źródła lub autora pliku SWF. W ten sposób, po uruchomieniu SWF wywołuje metodę JavaScript osadzania strony HTML, więc wiesz, że jest gotowa. Funkcja była jak:

function flashLoaded() { 
    // Oddly, directly calling setFocusOnFlash() didn't work on IE8 
    setTimeout(setFocusOnFlash, 1); 
} 
0

Metoda, z której korzystasz, działa tylko w Internet Explorerze - jest to ograniczenie sposobu używania lampy błyskowej.

http://kb2.adobe.com/cps/155/tn_15586.html

+0

i czy jest jakaś metoda na zrobienie tego w Chrome i innych przeglądarkach, czy też samostrująca lampa błyskowa po prostu nie sądzisz, że powinieneś/możesz to zrobić? – joon

+0

Może być na to sposób, ale na pewno jeszcze tego nie odkryłem. –

1

Sposobem na to jest użycie ExternalInterface i wysłać ostrość na Flash przy użyciu detektora JS na zdarzenie zakładki (czyli jak oddala się od elementu zakładka zanim Flash). W praktyce jest to trudne, a obsługa stage.focus w twoim AS wymaga radzenia sobie z niektórymi, ehm, dziwactwami. Ale to działa dość dużo dla wielu przeglądarek

0

ja rozpaczliwie chce dostać tę pracę, tak aby przyspieszyć mój własny rozwój gier Flash, aby uniknąć konieczności klikania za każdym razem, aby przetestować moją grę. Nie obchodziło mnie, czy działa we wszystkich przeglądarkach, więc tutaj jest taka, która działa tylko w Chrome.

<body onload='document.getElementById("haxe").focus();'> 
    <embed src="game.swf" id="haxe" ... 

Jeśli wypróbowałeś ostrość() przed i to nie działa dla Ciebie, trzeba pamiętać, że trzeba używać tylko osadzić tag, a nie wersję obiektu i param. Przetestowano na Chrome 40.0.2214.93 (64-bit).

Powiązane problemy