javascript 到 actionscript 按键传递实用程序?
Posted
技术标签:
【中文标题】javascript 到 actionscript 按键传递实用程序?【英文标题】:javascript to actionscript keypress passing utility? 【发布时间】:2010-10-15 13:43:06 【问题描述】:是否有现有的 javascript 库用于将浏览器(或某些 div)中的按键事件中继到 flash 中?我希望可能有一种like this one for mousewheel events 的库?
this 之类的东西可以很好地处理 JavaScript 键盘快捷键。我想我可以只监听这些事件并将我想要的事件传递到 Flash 中?
编辑:这些都是很好的例子,但是,如果 flash 有焦点,那么 javascript 击键就会丢失。如何确保所有关键事件都通过 javascript?
【问题讨论】:
【参考方案1】:这是另一个使用 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) 上测试。
【讨论】:
谢谢e鹏。有没有办法让你的演示在闪光灯有焦点时工作? (想先用 javascript 处理所有键盘事件,然后委托我希望它们如何处理。) 当flash有焦点时,你必须先处理flash中的事件,通过addEventListener(KeyboardEvent.KEY_DOWN, ...),然后将它们发送给JavaScript。我不认为你可以先在 JavaScript 中拦截它们...【参考方案2】:这是一个使用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(在本例中为 '我的电影'):
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);" >
应该是这样的。
【讨论】:
【参考方案3】:用 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")
【讨论】:
【参考方案4】:当 SWF 具有焦点时,您可以在动作脚本中监听按键。如果您愿意,也可以将它们发送到 Javascript。
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
private function onKeyDown(e:KeyboardEvent):void
// handle key down,
【讨论】:
以上是关于javascript 到 actionscript 按键传递实用程序?的主要内容,如果未能解决你的问题,请参考以下文章
Actionscript3 到 JavaScript 的通信:最佳实践
ActionScript 3 导航到URL。调用可选的javascript弹出窗口
使用 javascript 与 actionscript 3.0 交互
在没有网桥的情况下在JavaScript和ActionScript库之间共享代码