是否存在用于将浏览器(或某些div)中的按键事件转发到闪存中的现有javascript库?我希望可能有一种like this one for mousewheel events的库?
this之类的东西可以很好地处理javascript键盘快捷键。我想我可以只听那些事件并将我想要的事件传递给flash?
编辑:这些都是很好的例子,但是,如果flash有焦点,那么javascript键击就会丢失。如何确保所有关键事件都通过javascript?
答案 0 :(得分:2)
这是使用jQuery的另一个例子。您可以看到某种演示here。它跟踪从浏览器到文本框的按键。
您的JavaScript将是
var altPressed = false;
var ctrlPressed = false;
function getFlashMovie(movieName)
{
var isIE = navigator.appName.indexOf("Microsoft") != -1;
return (isIE) ? window[movieName] : document[movieName];
}
function sendCode(code) {
movie = getFlashMovie('keyboard-listener');
movie.keyEvent(code);
}
function activeKey(e) {
e.preventDefault();
if (e.which == 18) altPressed = true;
if (e.which == 17) ctrlPressed = true;
if ((e.which != 18)&&(e.which != 17)) sendCode((altPressed?'alt+':'')+(ctrlPressed?'ctrl+':'')+String.fromCharCode(e.which));
}
function inactiveKey(e) {
if (e.which == 18) altPressed = false;
if (e.which == 17) ctrlPressed = false;
}
$(document).ready(function() {
$(document).keydown(activeKey);
$(document).keyup(inactiveKey);
});
在Flash影片中,您将拥有以下代码:
ExternalInterface.addCallback('keyEvent',keyEvent);
function keyEvent(code:String):void {
// do something with the "code" parameter, that looks like "alt+ctrl+D", may use .split('+'), etc
}
您需要在html文件中导入jQuery,这就是它。 jQuery是跨浏览器的,因此不会出现任何问题。在Safari,Firefox和Opera(OSX)上测试过。
答案 1 :(得分:1)
以下是使用SWFObject / javascript / AS3 + ExternalInterface的示例 它可能会使用一些适应性来跨浏览器工作。我只在FF3(OSX)上试过它。
首先是一个包含简单日志字段(用于跟踪)的文档类。
它只是定义了一个ExternalInterface回调,它监听一个名为 flashLog 的方法调用,它将由私有方法 setMessage(... params)处理 强>
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.external.ExternalInterface;
import flash.text.TextField;
public class KeyStroke extends Sprite
{
private var tf:TextField;
public function KeyStroke()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
tf = addChild(new TextField()) as TextField;
tf.autoSize = 'left';
if(ExternalInterface.available)
{
if(ExternalInterface.addCallback("flashLog", setMessage))
{
tf.text = "addCallback() failed :(";
}
else
{
tf.text = "flash waiting";
}
}
else
{
setMessage("ExternalInterface not available!");
}
}
private function setMessage(...params):void
{
tf.text = "message : " + params.toString();
}
}
}
通过SWFObject添加 allowScriptAccess 属性来嵌入导出的SWF,您还需要提供一个ID,以便我们可以进一步找到SWF(在这种情况下为' < em> myMovie '):
var so = new SWFObject('KeyStroke.swf', 'myMovie', '800', '100', '9', '#f0f0f0');
so.addParam("allowScriptAccess","always");
so.write('content');
创建一个javascript函数来处理按键操作:
<script type="text/javascript">
function keyPressHandler(e)
{
// Calls the registered callback within the flash movie
getMovie('myMovie').flashLog("Key Down!"+e.charCode)
}
function getMovie(movieName) {
return document.getElementById(movieName);
}
</script>
以某种方式注册keyPressHandler(原型等有更好的方法):
<body onKeyPress="keyPressHandler(event);" >
应该是它。
答案 2 :(得分:0)
用alt / option键替换ctrl,但它不能处理mac上的选项:
这有效: //仅在浏览器中工作: //在SAFARI 4.0 Mac和Firefox 3.5 Mac上测试
function onKey_Up(e:KeyboardEvent):void {
tf2.appendText("\n"+e.keyCode)
//alt+C
if(e.keyCode==231){
tf2.appendText("\nALT + C")
}
//alt+V
if(e.keyCode==175){
tf2.appendText("\nALT + V")
}
//alt+X
if(e.keyCode==188){
tf2.appendText("\nALT + X")
}
}
答案 3 :(得分:0)
当SWF具有焦点时,您只需在动作脚本中听取按键。如果你愿意,你也可以将它们发送给Javascript。
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
private function onKeyDown(e:KeyboardEvent):void
{
// handle key down,
}