2011-10-27 7 views
5

He estado tratando de configurar esta página de prueba para mi juego flash pero se niega a enfocarse en la carga. Leí un montón de entradas al foro y no pude hacer nada, realmente no puedo creer que esto sea tan difícil.¿Cómo hago para que mi objeto flash se enfoque en la carga?

Esto es lo que tengo:

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

se puede ver en vivo aquí, http://joon.be/exclusivepreview/

lo que está mal con ella? No tengo un conocimiento muy profundo de swfObject ...

Respuesta

6

He encontrado una manera que funciona para mí en Firefox 16, Chrome 23 e IE 8 (aquí es donde lo he probado hasta ahora). Por supuesto, este es un montón de hacks, así que quién sabe si funcionará para siempre ... pero ciertamente no empeora las cosas.

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

En Firefox solamente, también se necesitaba <param name="wmode" value="opaque"> bajo el elemento object, o de lo contrario focus() no tuvo ningún efecto. (He utilizado Stephen Belanger de jquery.flash, donde se puede especificar wmode; supongo que también es posible con SWFObject.)

Pero la parte más difícil es que no se debe llamar setFocusOnFlash demasiado pronto. Para Chrome e IE, agregue setTimeout(setFocusOnFlash, 1) directamente después de que el JavaScript que inserta el objeto haya funcionado. La emisión directa de setFocusOnFlash() no lo hizo. Supongo que el truco es simplemente que las devoluciones de llamada cronometradas solo se invocan una vez que el navegador ha procesado por completo el cambio de documento, independientemente de la demora que especifique. Pero en las llamadas de Firefox con este pequeño retraso fue demasiado temprano; ha puesto un borde punteado alrededor del elemento object (no debería) y Flash no recibió los trazos de tecla. Establecer el retraso en 250 ha solucionado esto en mi computadora, pero quién sabe qué tan grande es la demora que necesita. (Peor aún, repetir las llamadas setFocusOnFlash tampoco ayudaba ... una vez que el borde punteado estaba allí, no tenían ningún efecto adicional). Entonces, lo que hice fue agregar una devolución de llamada ExternalInterface.call("flashLoaded") al flash constructor de clase de documento. Para que quede claro, lo hace en Flash/ActionScript, por lo que necesita acceso a la fuente o al autor del archivo SWF. De esta forma, cuando se inicia el archivo SWF, llama al método flashLoaded JavaScript de la página HTML incrustada, para que sepa que está listo. La función era como:

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

El método que está utilizando solo funcionará con Internet Explorer; es una limitación de la forma en que se usa el flash.

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

+0

y hay algún método para hacer esto con Chrome y otros navegadores, o es el flash de enfoque automático simplemente no creo que deba/pueda hacer? – joon

+0

Puede haber una forma de hacerlo, pero seguro que aún no lo he descubierto. –

1

La manera de hacer esto es utilizar ExternalInterface y enviar el foco a Flash utilizando un oyente JS en el caso pestaña (es decir, que la pestaña se aleja del elemento antes de que Flash). En la práctica, es difícil y el manejo de stage.focus en su AS necesita lidiar con algunos, erm, peculiaridades. Pero funciona bastante cross browser

0

que estaba buscando desesperadamente conseguir este trabajo, sólo para acelerar mi propio desarrollo de juegos Flash para evitar tener que hacer clic cada vez para probar mi juego. Así que no me importa si funciona en todos los navegadores, así que aquí hay uno que funciona solo en Chrome.

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

Si ha tratado de enfoque() antes y no funcionó para usted, tenga en cuenta que usted tiene que utilizar sólo el incrustar etiqueta, no la versión de objeto y el parámetro.

Probado en la versión 40.0.2214.93 (64 bits) de Chrome.

Cuestiones relacionadas