簡體   English   中英

Flash阻止javascript事件

[英]flash blocking javascript events

這是對原始帖子的修改,現在我可以更好地理解問題了。 現在帶有源代碼!

在IE中,如果身體(或其它HTML div有對焦),那么你按鍵和點擊閃光的同時 ,再松開...... keyUp事件是從來沒有發射 它不會在javascript或Flash中觸發。 此舉報事件在哪里?

這是您觸發事件的順序:

  1. javascriptKeyEvent:bodyDn ** currentFocusedElement:正文
  2. javascriptKeyEvent:docDn ** currentFocusedElement:正文
  3. actionScriptEvent:激活** currentFocusedElement:[object]
  4. actionScriptEvent:mouseDown ** currentFocusedElement:[對象]
  5. actionScriptEvent:mouseUp ** currentFocusedElement:[對象]

隨后的keydown和keyup事件由Flash捕獲,但是該初始keyUp不會在任何地方觸發。 我需要那個鍵盤!

什么不起作用:

  • 檢查密鑰是否在沒有監聽器的情況下啟動。 檢查鑰匙是否按下?
  • wmode不透明或直接。 盡管不透明,但復制起來卻困難得多。
  • 將焦點推回到javascript盡快趕上事件。 (在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);
    }
}

}
}

這是我預期會發生的事情:在html中聚焦時,您會按鍵。 您單擊Flash對象,焦點將轉到該對象。 解除鍵時,由於html不再具有焦點,因此它不知道鍵向上。 您只需執行相同的操作即可輕松測試,而不必單擊Flash對象,單擊另一個窗口並嘗試相同的操作,因為這實際上是正在發生的事情。

至於關鍵事件沒有在閃存中發生,這很可能是因為它在不按下鍵的情況下不會生成關鍵事件,而由於焦點仍然在html中而沒有得到它。

我可以想到兩種可能的解決方案。 首先是確保閃光燈對象從焦點開始 第二個方法是在Flash對象上覆蓋一個空的div,以便它永遠不會獲得焦點。

將您的SWF嵌入置於任何其他JavaScript之前。

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

我會在所有函數之外或在准備好文檔的jQuery函數中嘗試使用它,因為Flash的Z索引為無窮大,並且應該在其他任何東西之前接受鍵擊,除非在第一次鍵入鍵時不存在它。

我的猜測是,任何人都無法接收到第一個密鑰。 在文檔就緒功能中嘗試使用jQuery的keyup事件觸發器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM