代码之家  ›  专栏  ›  技术社区  ›  jedierikb grijalvaromero

flash阻止javascript事件

  •  8
  • jedierikb grijalvaromero  · 技术社区  · 15 年前

    这是对原帖的一次编辑,现在我更好地理解了这个问题。 现在有了源代码!

    在ie中,如果body(或另一个html div有焦点),则在 同时 ,然后释放… 键控事件从不触发 . 它不是在javascript或flash中触发的。这个钥匙事件在哪里?

    这是您得到的事件触发顺序:

    1. JavaScriptKeyEvent:BodyDN**当前焦点删除:正文
    2. javascriptkeyevent:docdn**当前焦点删除:正文
    3. actionScriptEvent:激活**currentFocusedElement:[对象]
    4. actionScriptEvent:mousedown**当前焦点删除:[对象]
    5. actionscriptevent:mouseup**当前焦点删除:[对象]

    随后的keydown和keyup事件被flash捕获,但初始keyup永远不会被触发。任何地方。我需要那把钥匙!

    什么不起作用:

    • 检查在没有侦听器的情况下是否启动了密钥。 Check if a key is down?
    • wmode不透明或直接。虽然,由于不透明,复制起来要困难得多。
    • 尽快将焦点推回到javascript以赶上up事件。(用javascript中的blur监听器尝试过,并在as3激活时设置了焦点。)
    • jquery或prototype都无法捕获丢失的keyup
    • 静态和动态swfoject发布

    下面是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 回复  |  直到 15 年前
        1
  •  1
  •   Russell Leggett    15 年前

    这就是我所期望的:当焦点在html中时,你可以按键。你点击flash对象,焦点就会转到这个位置。当密钥被解除时,因为html不再具有焦点,所以它不知道密钥向上。你只需做同样的事情,而不是点击flash对象,点击另一个窗口,然后尝试同样的事情,就可以很容易地测试这一点,因为这实际上就是正在发生的事情。

    至于没有在flash中发生的key-up事件,这可能是因为它不会在没有得到key-down的情况下生成key-up事件,这是因为焦点仍然在html中,所以它从来没有得到过key-up事件。

    我可以想出两种可能的解决办法。首先要确保 flash object starts with focus . 第二个是在flash对象上覆盖一个空div 从未 接收焦点。

        2
  •  0
  •   Todd Moses    15 年前

    将swf嵌入放在任何其他javascript之前。

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

    我会在所有函数之外或者在一个文档就绪的jquery函数中尝试它,因为flash得到一个无穷大的z索引,并且应该在其他任何函数之前接受键笔划,除非在第一个键向上发生时它还不存在。

    我的猜测是,第一把钥匙是在任何东西都能收到之前出现的。在on document ready函数中使用jquery尝试keyup事件触发器。