Javascript для ActionScript Утилита передачи нажатия клавиш? - PullRequest
4 голосов
/ 26 марта 2009

Существует ли библиотека javascript для передачи событий нажатия клавиш в браузере (или определенных элементах div) во флэш-память? Я надеюсь, что может быть библиотека типа , подобная этой для событий колесика мыши ?

Что-то вроде , это отлично справляется с сочетаниями клавиш javascript. Полагаю, я мог бы просто послушать эти события и передать те, которые я хочу, во флэш-память?


РЕДАКТИРОВАТЬ: Это отличные примеры, однако, если Flash имеет фокус, то нажатия клавиш javascript теряются. Как вы можете гарантировать, что все ключевые события проходят через JavaScript?

Ответы [ 4 ]

2 голосов
/ 26 марта 2009

Вот еще один пример использования jQuery. Вы можете увидеть какое-то демо здесь . Он отслеживает нажатия клавиш из браузера в текстовое поле.

Ваш 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
}

Вам нужно будет импортировать jQuery в ваш HTML-файл, и это все. jQuery является кросс-браузерным, поэтому никаких проблем возникнуть не должно. Протестировано на Safari, Firefox и Opera (OSX).

1 голос
/ 26 марта 2009

Вот пример использования 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();
        }
    }
}

Внедрить экспортированный SWF-файл через SWFObject , добавив атрибут allowScriptAccess , вам также потребуется указать идентификатор, чтобы мы могли найти SWF-файл далее (в данном случае ' 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);" >

Так и должно быть.

0 голосов
/ 11 сентября 2011

Когда у SWF есть фокус, вы можете просто прослушать в ActionScript нажатие клавиш. И если вы хотите, вы также можете отправить их в Javascript.

addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

private function onKeyDown(e:KeyboardEvent):void 
{
   // handle key down,
}
0 голосов
/ 31 декабря 2009

Заменил ctrl клавишей alt / option, но он не обрабатывает опцию на 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")
    }
}
...