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:
- javascriptKeyEvent: bodyDn ** currentFocusedElement: corpo
- javascriptKeyEvent: docDn ** currentFocusedElement: corpo
- actionScriptEvent: attivare ** currentFocusedElement: [oggetto]
- actionScriptEvent: mouseDown ** currentFocusedElement: [oggetto]
- 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);
}
}
}
}
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 :-) –