8

esto es una edición de la publicación original ahora que entiendo mejor el problema. ahora con código fuente!flash javascript events

En IE, si el cuerpo (o en otro div HTML tiene el foco), a continuación, haga clic en & pulsación de tecla flash al mismo tiempo , a continuación, suelte ... un evento keyup Nunca se dispara. No está activado en javascript o en flash. ¿Dónde está este evento clave?

Este es el orden de disparar caso se obtiene en su lugar:

  1. javascriptKeyEvent: bodyDn ** currentFocusedElement:
  2. cuerpo
  3. javascriptKeyEvent: docDn ** currentFocusedElement:
  4. cuerpo
  5. actionScriptEvent: activar ** currentFocusedElement: [object]
  6. actionScriptEvent: mouseDown ** currentFocusedElement: [object]
  7. actionScriptEvent: mouseUp ** currentFocusedElement: [object]

Los siguientes eventos de keydown y keyup son capturados por flash, pero esa keyUp inicial nunca se dispara .. en cualquier lugar. ¡Y necesito esa tecla!

lo que no funciona:

  • comprobar si la clave es sin un oyente. Check if a key is down?
  • wmode opaco o directo. Aunque, con opaco, es mucho más difícil de reproducir.
  • empujando el foco a javascript lo antes posible para ver el evento. (Intentado esto con un oyente desenfoque en javascript y ajustar el enfoque cuando se activa AS3.)
  • ni jQuery o prototipo capturan la falta keyup
  • tanto estática como dinámica swfobject publicación

Aquí es el html/javascript :

<html> 

<head> 
    <script type="text/javascript" src="prototype.js"></script> 
    <script type="text/javascript" src="swfobject.js"></script> 

    <script> 


    function ic(evt) 
    { Event.observe($("f1"), 'keyup', onKeyHandler.bindAsEventListener(this, "f1Up")); 
     Event.observe($("f2"), 'keyup', onKeyHandler.bindAsEventListener(this, "f2Up")); 
     Event.observe(document, 'keyup', onKeyHandler.bindAsEventListener(this, "docUp")); 
     Event.observe($("body"), 'keyup', onKeyHandler.bindAsEventListener(this, "bodyUp")); 
     Event.observe(window, 'keyup', onKeyHandler.bindAsEventListener(this, "windowUp")); 

     Event.observe($("f1"), 'keydown', onKeyHandler.bindAsEventListener(this, "f1Dn")); 
     Event.observe($("f2"), 'keydown', onKeyHandler.bindAsEventListener(this, "f2Dn")); 
     Event.observe(document, 'keydown', onKeyHandler.bindAsEventListener(this, "docDn")); 
     Event.observe($("body"), 'keydown', onKeyHandler.bindAsEventListener(this, "bodyDn")); 
     Event.observe(window, 'keydown', onKeyHandler.bindAsEventListener(this, "windowDn")); 

     Event.observe("clr", "mousedown", clearHandler.bindAsEventListener(this)); 

     swfobject.embedSWF("tmp.swf", 
          "f2", 
          "100%", 
          "20px", 
          "9.0.0.0", null, {}, {}, {}); 
    } 

    function clearHandler(evt) 
    { clear(); 
    } 

    function clear() 
    { $("log").innerHTML = "";  
    } 

    function onKeyHandler(evt, dn) 
    { logIt("javascriptKeyEvent:"+dn); 
    } 

    function AS2JS(wha) 
    { logIt("actionScriptEvent::" + wha); 
    } 

    function logIt(k) 
    { 
     var id = document.activeElement; 
     if (id.identify) 
     { id = id.identify(); 
     } 

     $("log").innerHTML = k + " ** focuedElement: " + id + "<br>" + $("log").innerHTML; 
    } 

    Event.observe(window, 'load', ic.bindAsEventListener(this)); 

    </script> 

</head> 

<body id="body"> 
<div id="f1"><div id="f2" style="width:100%;height:20px; position:absolute; bottom:0px;"></div></div> 

<div id="clr" style="color:blue;">clear</div> 

<div id="log" style="overflow:auto;height:200px;width:500px;"></div> 
</body> 
</html> 

Este es el código AS3:

package 
{ 

import flash.display.Sprite; 
import flash.display.StageAlign; 
import flash.display.StageScaleMode; 
import flash.events.KeyboardEvent; 
import flash.events.MouseEvent; 
import flash.events.Event; 
import flash.external.ExternalInterface; 

public class tmpa extends Sprite 
{ 

public function tmpa():void 
{ 
    extInt("flashInit"); 
    stage.align = StageAlign.TOP_LEFT; 
    stage.scaleMode = StageScaleMode.NO_SCALE; 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDnCb, false, 0, true); 
    stage.addEventListener(KeyboardEvent.KEY_UP, keyUpCb, false, 0, true); 

    stage.addEventListener(MouseEvent.MOUSE_DOWN, mDownCb, false, 0, true); 
    stage.addEventListener(MouseEvent.MOUSE_UP, mUpCb, false, 0, true); 
    addEventListener(Event.ACTIVATE, activateCb, false, 0, true); 
    addEventListener(Event.DEACTIVATE, dectivateCb, false, 0, true); 
} 

private function activateCb(evt:Event):void 
{ extInt("activate"); 
} 

private function dectivateCb(evt:Event):void 
{ extInt("deactivate"); 
} 

private function mDownCb(evt:MouseEvent):void 
{ extInt("mouseDown"); 
} 

private function mUpCb(evt:MouseEvent):void 
{ extInt("mouseUp"); 
} 

private function keyDnCb(evt:KeyboardEvent):void 
{ extInt("keyDn"); 
} 

private function keyUpCb(evt:KeyboardEvent):void 
{ extInt("keyUp"); 
} 

private function extInt(wha:String):void 
{ try 
    { ExternalInterface.call("AS2JS", wha); 
    } 
    catch (ex:Error) 
    { trace('ex: ' + ex); 
    } 
} 

} 
} 
+0

No activar el evento de teclado en JavaScript me parece el comportamiento esperado. Los controles ActiveX consumen eventos y no los vuelven a propagar al documento que los contiene. Sin embargo, eso no explica por qué Flash no activa el evento correctamente, una pregunta interesante. Desafortunadamente, creo que las únicas personas que podrían responder la pregunta son el personal de Adobe :-) –

Respuesta

1

Esto es lo que espero que esté pasando: Presiona la tecla mientras el foco está en html. Hace clic en el objeto flash y el foco va a eso. Cuando se levanta la llave, porque el html ya no tiene foco, no sabe acerca de la llave.Puede probar esto haciendo lo mismo solo en lugar de hacer clic en el objeto flash, hacer clic en otra ventana y probar lo mismo, porque eso es lo que está sucediendo efectivamente.

En cuanto a que el evento de tecla no ocurra en flash, es probable porque no genera eventos de tecla sin obtener una tecla hacia abajo, que nunca obtuvo porque el foco todavía estaba en html.

Puedo pensar en dos posibles soluciones a esto. El primero es asegurarse de que flash object starts with focus. El segundo es superponer un div vacío sobre el objeto flash para que nunca reciba el foco.

+0

En cuanto a su segunda sugerencia, un div vacío en la parte superior del swf, esto funciona, pero verse obligado a utilizar modos de inserción compatibles hace que el rendimiento se resienta. Lamentable. – jedierikb

+0

Con respecto a su primera sugerencia, si su flash incrustado es solo uno de muchos elementos en una página, entonces la sugerencia de Adobe tiene una utilidad limitada. – jedierikb

+1

Por curiosidad, ¿qué hay de usar el evento de desenfoque como una falla a prueba de fallas? Es decir, si el documento recibe una clave, un evento de desenfoque, activa el evento de tecla manualmente. – Hubro

0

Coloque su SWF incrustado antes que cualquier otro JavaScript.

swfobject.embedSWF("tmp.swf", 
          "f2", 
          "100%", 
          "20px", 
          "9.0.0.0", null, {}, {}, {}); 

me gustaría probar fuera de todas las funciones o en una función jQuery lista de documentos, ya que Flash consigue un índice z del infinito y debe aceptar pulsaciones de teclas antes de cualquier otra cosa, a menos que todavía no está presente cuando se produce la primera keyup .

Supongo que la primera clave se está produciendo antes de que algo pueda recibirla. Pruebe el desencadenador de evento de teclado con jQuery en una función de documento listo.

+0

Gracias. He leído tu respuesta algunas veces, y creo que piensas que el problema es solo en el tiempo de carga. Por favor, corríjame si estoy equivocado. Una vez cargado, el problema ocurre repetidamente: puede enfocar otro div html y luego hacer clic en/escribir en flash para reproducir "perder la clave". – jedierikb