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库之间共享代码

在 JavaScript 和 ActionScript 之间共享数组引用

用于广告的 JavaScript 或 ActionScript