8

questa è una modifica del post originale ora che ho capito meglio il problema. ora con il codice sorgente!flash blocking eventi javascript

In IE, se il corpo (o di un altro div html ha il focus), allora si Keypress & click su flash allo stesso tempo , quindi rilasciare ... un evento KeyUp non è mai sparato. Non viene attivato in javascript o in flash. Dov'è questo evento di keyup?

questo è l'ordine di sparare evento si ottiene invece:

  1. javascriptKeyEvent: bodyDn ** currentFocusedElement: corpo
  2. javascriptKeyEvent: docDn ** currentFocusedElement: corpo
  3. actionScriptEvent: attivare ** currentFocusedElement: [oggetto]
  4. actionScriptEvent: mouseDown ** currentFocusedElement: [oggetto]
  5. actionScriptEvent: mouseUp ** currentFocusedElement: [oggetto]

Gli eventi di keydown e keyup successivi vengono catturati dal flash, ma il keyUp iniziale non viene mai attivato .. ovunque. E ho bisogno di quella chiave!

cosa non funziona:

  • Verificando la chiave è senza un ascoltatore. Check if a key is down?
  • wmode opaco o diretto. Anche se, con l'opaco, è molto più difficile da riprodurre.
  • riportando il focus su javascript al più presto per catturare l'evento. (Provato con un ascoltatore sfocatura in javascript e modificando fuoco quando viene attivato AS3.)
  • né jquery o prototipo catturare dispersi keyup
  • sia statica che dinamica swfobject pubblicazione

Ecco l'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> 

ecco il codice 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

Non attivare l'evento keyup in JavaScript suona come il comportamento previsto. I controlli ActiveX consumano eventi e non li propagano nuovamente al documento che li contiene. Questo non spiega perché Flash non licenzi correttamente l'evento - una domanda interessante. Purtroppo penso che le uniche persone che potrebbero essere in grado di rispondere alla domanda siano lo staff di Adobe :-) –

risposta

1

Ecco cosa mi aspetto sta succedendo: la pressione del tasto mentre lo stato attivo è in html. Fai clic sull'oggetto flash e lo stato attivo va a quello. Quando la chiave viene rimossa, poiché l'html non ha più il focus, non sa della chiave.Potresti facilmente testarlo facendo la stessa cosa solo invece di cliccare sull'oggetto flash, fare clic su un'altra finestra e provare la stessa cosa, perché è effettivamente ciò che sta accadendo.

Per quanto riguarda l'evento di key-up che non si verifica in flash, è probabile perché non genera eventi di key-up senza ottenere un tasto premuto, che non ha mai ottenuto perché lo stato attivo era ancora in html.

Posso pensare a due possibili soluzioni a questo. Il primo è assicurarsi che il flash object starts with focus. Il secondo è quello di sovrapporre un div vuoto sull'oggetto flash in modo che lo mai riceva il focus.

+0

Per quanto riguarda il tuo secondo suggerimento - un div vuoto in cima allo swf - questo funziona, ma essere costretti a usare modalità embed compatibili fa soffrire le prestazioni. Deplorevole. – jedierikb

+0

Per quanto riguarda il primo suggerimento, se il flash incorporato è solo uno dei molti elementi di una pagina, il suggerimento di Adobe ha un'utilità limitata. – jedierikb

+1

Per curiosità, che ne dici di utilizzare l'evento sfocatura come un fail safe per il keydown? Cioè, se il documento riceve un keydown, quindi un evento di sfocatura, attiva manualmente l'evento keyup. – Hubro

0

Inserisci il tuo SWF Incorpora prima di qualsiasi altro JavaScript.

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

vorrei provare al di fuori di tutte le funzioni o in una funzione jQuery pronto documento in quanto Flash ottiene un z-index di infinito e dovrebbe accettare colpi di chiave prima di ogni altra cosa, a meno che non è ancora presente quando si verifica il primo keyup .

La mia ipotesi è che la prima chiave sia presente prima che qualcosa sia in grado di riceverla. Prova il tuo trigger evento keyup con jQuery in una funzione su documento pronto.

+0

Grazie. Ho letto la tua risposta alcune volte e penso che tu pensi che il problema sia solo al momento del caricamento. Perfavore, correggimi se sbaglio. Una volta caricato, il problema si ripete ripetutamente: puoi dare fuoco a un altro div html, quindi fare clic su/digita su flash per riprodurre "perdere la chiave". – jedierikb