2011-10-27 9 views
5

Ho cercato di configurare questa pagina di test per il mio gioco flash, ma si rifiuta di concentrarsi sul caricamento. Ho letto un sacco di voci sul forum e non ho potuto fare nulla, non posso davvero credere che questo dovrebbe essere così difficile.Come faccio a mettere a fuoco il mio oggetto flash sul caricamento?

Ecco quello che ho:

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

è possibile vedere dal vivo qui, http://joon.be/exclusivepreview/

cosa c'è che non va? Non ho una conoscenza approfondita di swfObject ...

risposta

6

Ho trovato un modo che funziona per me su Firefox 16, Chrome 23 e IE 8 (questi sono dove l'ho testato finora). Certo, questo è un mucchio di hack, quindi chissà se funzionerà per sempre ... ma certamente non peggiora le cose.

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

Su Firefox solo, è stato anche necessario <param name="wmode" value="opaque"> sotto l'elemento object, altrimenti focus() avuto alcun effetto. (Ho usato Stephen Belanger di jquery.flash, dove è possibile specificare wmode, suppongo che sia possibile anche con SWFObject.)

Ma la parte più difficile è che non è necessario chiamare setFocusOnFlash troppo presto. Per Chrome e IE, aggiungere setTimeout(setFocusOnFlash, 1) direttamente dopo che il JavaScript che inserisce l'oggetto ha funzionato. Emissione diretta setFocusOnFlash() no. Presumo il trucco è semplicemente che i callback temporizzati vengono chiamati solo dopo che il browser ha completamente elaborato la modifica del documento, indipendentemente dal ritardo specificato. Ma su Firefox chiamare con questo piccolo ritardo era troppo presto; ha messo un bordo tratteggiato attorno all'elemento object (non dovrebbe) e Flash non ha ottenuto i tratti chiave. L'impostazione del ritardo su 250 ha risolto questo problema sul mio computer, ma chissà quanto tempo è necessario. (Peggio ancora, la ripetizione delle chiamate setFocusOnFlash non ha aiutato nessuno ... una volta che il bordo tratteggiato era lì, non ha avuto ulteriori effetti.) Quindi, quello che ho fatto è stato aggiungere un callback al flash costruttore di classi di documenti. Per essere chiari, lo fai in Flash/ActionScript, quindi devi accedere al sorgente o all'autore del file SWF. In questo modo, all'avvio del SWF, viene chiamato il metodo JavaScript flashLoaded della pagina HTML incorporata, in modo che tu sappia che è pronto. La funzione era come:

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

Il metodo che stai utilizzando funziona solo con Internet Explorer: è un limite del modo in cui viene utilizzato il flash.

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

+0

e c'è qualche metodo per farlo con Chrome e altri browser, o il flash automatico di messa a fuoco non è una cosa che si dovrebbe/si può fare? – joon

+0

Potrebbe esserci un modo per farlo, ma di sicuro non l'ho ancora capito. –

1

Il modo per farlo è quello di utilizzare ExternalInterface e inviare la messa a fuoco Flash utilizzando un ascoltatore JS sull'evento scheda (vale a dire come la scheda si allontana dal elemento prima Flash). In pratica è difficile e la gestione dello stage.focus nel tuo AS ha bisogno di affrontare alcuni, erm, stranezze. Ma funziona praticamente cross browser

0

stavo disperatamente cercando di ottenere questo lavoro, solo per accelerare il mio sviluppo di giochi Flash per evitare di dover cliccare ogni volta per testare il mio gioco. Quindi non mi importa se funziona su tutti i browser, quindi eccone uno che funziona solo su Chrome.

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

Se hai provato messa a fuoco() prima e non ha funzionato per voi, si noti che è necessario utilizzare solo il incorporare tag, non la versione dell'oggetto e param.

Testato su Chrome versione 40.0.2214.93 (64-bit).

Problemi correlati