2008-10-31 14 views
16

Tengo una aplicación flash en mi página, y cuando un usuario interactúa con la aplicación flash, el navegador/html/javascript deja de recibir información del teclado.Flash roba el foco del navegador

Por ejemplo, en Firefox control-t ya no se abre una pestaña nueva.

Sin embargo, si hago clic en parte de la página que no es flash, el navegador comienza a recibir estos eventos nuevamente.

¿Hay alguna forma programática (ya sea mediante flash o javascript) para volver a enfocar el navegador?

Después de que el usuario haga clic en un botón en flash, tengo el flash ejecutando una devolución de llamada javascript, así que he intentado enfocar un campo de formulario (y al cuerpo) a través de javascript, pero ese enfoque no parece estar trabajando.

Un ejemplo quizás más concreto es Youtube. Ellos también tienen este problema. Cuando hago clic en el botón reproducir/pausar o ajuste el volumen, espero que los controles del teclado de mi navegador aún funcionen, pero no es así, tengo que hacer clic en algún lugar de la página fuera del área de la película. Este es el problema exacto que intento resolver.

Respuesta

3

Creo que Adobe tiene que soltar el foco cuando el mouse sale de su área de cliente, o proporcionar una opción para hacerlo.

Sin embargo, creo que la mayoría de los desarrolladores de Flash (y especialmente los que hacen juegos) se basan en el hecho de que la aplicación de flash captura la entrada del teclado, independientemente de dónde esté el mouse.

0

Puede devolver el foco al navegador haciendo una getUrl puede llamar javascript en la página HTML:

document.body.focus() 

La forma de hacerlo en la película Flash dependerá de cómo la interacción del usuario con las obras de cine . Podrías seguir haciéndolo en un temporizador, o cuando un control pierde el foco, o cuando el mouse se mueve. Depende.

5

Puede usar la clase ExternalInterface dentro de Flash para llamar a JavaScript. Por ejemplo, podría configurar una función en un intervalo (Event.ENTER_FRAME por ejemplo) para llamar a la función de JavaScript que @Diodeus mencionó:

document.body.focus(); 

O, una solución aún mejor sería añadir un detector de eventos para el flash root (etapa) para escuchar cuando el mouse sale de Flash. Puede configurar este evento para mover el foco a 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 en su página:

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

Avísame si quieres un ejemplo AS2, y voy a publicar para arriba.

Quería hacer una nota acerca de esta solución: una vez que vuelva a enfocar el navegador, necesitará que el usuario vuelva a hacer clic en el complemento Flash para activar la entrada del usuario dentro del complemento flash. Esto podría ser una experiencia de usuario discordante, y es algo a tener en cuenta al usar esta solución.

+0

Nice one! No sé ni un poco de Flash (y no quiero, el plato está lleno ;-), así que este es un tidbit de código que enviaré por correo masivo a cualquier Flash'er que conozca. –

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>  

Ahora, lo que sucede con otros teclados? es 84 estándar para T?Me gusta la idea de enfoque, pero en las aplicaciones de navegador completo no hay tanto espacio para perder el foco. El usuario también puede cambiar la combinación de teclas, no creo que esto sea una solución completa para esto sin flash sondear la configuración de comando desde el navegador y luego escuchar el combo, como básicamente hacemos aquí. No se.

Esto también solo intenta abrir una nueva ventana después de dar el foco, no tiene sentido para mí hacer que el usuario presione dos veces a menos que bloqueen la ventana como una ventana emergente. Pero el foco se llama primero así que, si eso sucede, el segundo intento debería funcionar. Puede alertar al usuario en una aplicación de navegador si es necesario.

2

En Firefox, document.body.focus(); no funciona. Usando la misma idea que la solución de Cláudio Silva a este Chrome issue, el siguiente JavaScript funcionará en Firefox:

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

Hay una solución a continuación en caso de que alguien lo necesita. Para mí, eso funciona bastante bien. Puedo hacer clic en mi Flash pero aún utilizar toda la funcionalidad del teclado del navegador (el foco se desplaza a la parte html cuando se hace clic dentro de Flash).

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

Cuestiones relacionadas