Флэш-блокировка событий JavaScript - PullRequest
8 голосов
/ 16 марта 2010

это редактирование исходного поста, теперь я лучше понимаю проблему. теперь с исходным кодом!

В IE, если тело (или другой HTML-элемент имеет фокус), вы нажимаете и нажимаете на флэш-память в то же время , затем отпускаете ... событие keyup никогда не запускается 1010 *. Он не запускается ни в javascript, ни во flash. Где это событие keyup?

Это порядок запуска событий, который вы получаете вместо:

  1. javascriptKeyEvent: bodyDn ** currentFocusedElement: body
  2. javascriptKeyEvent: docDn ** currentFocusedElement: body
  3. actionScriptEvent: активировать ** currentFocusedElement: [объект]
  4. actionScriptEvent: mouseDown ** currentFocusedElement: [объект]
  5. actionScriptEvent: mouseUp ** currentFocusedElement: [объект]

Последующие события keydown и keyup фиксируются флеш-памятью, но эта первоначальная keyUp никогда не запускается ... нигде. И мне нужен этот брелок!

Что не работает:

  • проверка, работает ли ключ без слушателя. Проверить, не нажата ли клавиша?
  • режим непрозрачный или прямой. Хотя при непрозрачности воспроизвести гораздо сложнее.
  • перенесение фокуса обратно на javascript как можно скорее, чтобы поймать событие up. (попробовал это с слушателем размытия в javascript и установкой фокуса, когда активирован as3.)
  • ни jquery, ни прототип не захватывают недостающий ключ
  • статическая и динамическая публикация swfobject

Вот 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>

Вот код 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);
    }
}

}
}

Ответы [ 2 ]

1 голос
/ 30 марта 2010

Я ожидаю, что происходит: вы нажимаете клавишу, пока фокус находится на html. Вы нажимаете на объект вспышки, и фокус переходит к этому. Когда ключ снят, потому что HTML больше не имеет фокуса, он не знает о ключе вверх. Вы можете легко проверить это, выполнив одно и то же только вместо того, чтобы щелкать по объекту флэш-памяти, щелкнуть в другом окне и попробовать то же самое, потому что это именно то, что происходит.

Что касается события key up, которое не происходит во флэш-памяти, скорее всего потому, что оно не генерирует события key up без сброса ключа, чего не было, потому что фокус все еще был в html.

Я могу придумать два возможных решения этого. Во-первых, убедитесь, что флэш-объект начинается с фокуса . Второй - наложить пустой элемент div на объект flash, чтобы он никогда не получал фокус.

0 голосов
/ 17 марта 2010

Поместите свой SWF Embed перед любым другим JavaScript.

swfobject.embedSWF( "tmp.swf",
                            "f2",
                            "100%",
                            "20px",
                            "9.0.0.0", null, {}, {}, {} );

Я бы попробовал это вне всех функций или в функции jQuery, готовой к документу, потому что Flash получает z-индекс бесконечности и должен принимать нажатия клавиш раньше всего, кроме случаев, когда он еще не присутствует, когда произойдет первый запуск ключа.

Я предполагаю, что первый ключ происходит прежде, чем что-либо сможет его получить. Попробуйте свой триггер события keyup с jQuery в функции готовности документа.

...