1

内部と iFrame にフラッシュがあり、フラッシュではなく iFrame をクリックしたい。「pointer-events: none;」を介して iFrame をクリックできることがわかりました。ただし、iframe内のすべてを渡します。ここで知りたいのは、フラッシュでのマウス クリックを有効にするか、またはチェックすることができるかということです。

質問のサンプルを追加しました。黒い点はフラッシュ SWF ファイルと iFrame にあります。透明な領域をクリックすると、この場合はラベルボタンである領域の下をクリックする必要があります。それ以外の場合は、黒い点をクリックする必要があります。

フラッシュの下をクリック

4

2 に答える 2

1

やることリスト :

  1. pointer-events: none;iframeで CSS 属性を使用する
  2. 要素をカバーするID="event-eater"で非表示のdivを作成します。
  3. 以下に Javascript を追加 (jQuery を使用) して、クリックが発生した場所を認識する
  4. actionscript メソッド ClickPosition を呼び出し、返された結果に基づいて次のいずれかを実行します
    • 黒い領域がクリックされた場合 - 何もしない、アクション スクリプトでクリック イベントが作成された
    • 背景がクリックされた場合 - 現在の要素を一時的に非表示にし、javascript でクリックを再作成します

Javascript

$('#event-eater').click(function(evt) {
    var posX = $(this).offset().left, posY = $(this).offset().top;
    var x = Math.abs(Math.round(evt.pageX - posX));
    var y = Math.abs(Math.round(evt.pageY - posY));
    var result = "["+x+", "+y+"]";
    if(document['flashInterface'].ClickPosition(result)=="true"){
        $('#event-eater').css({display:'none'});
        starter = document.elementFromPoint(evt.clientX, evt.clientY);
        $(starter).click();
        $('#event-eater').css({display:''});
    };
});

アクションスクリプト

package
{
    import fl.events.ColorPickerEvent;
    import flash.display.MovieClip;
    import flash.external.ExternalInterface;
    public class Main extends MovieClip {
        //set this variable true if background was clicked last, false otherwise
        var wasBackgroundClickedLast:Boolean = new Boolean(true)
        public function Main() {
            //allows JavaScript to access the ClickPosition() function.
            ExternalInterface.addCallback("ClickPosition", clickPosition);  
        }
        public function clickPosition(value:String):String{
            var va= str.split(",");
            simulateClick(Number(va[0]),Number(va[1]));
            return wasBackgroundClicked.toString();
        }
        public function simulateClick(x:Number, y:Number):void
        {
            var objects:Array = stage.getObjectsUnderPoint(new Point(x, y));
            var target:DisplayObject;
            while(target = objects.pop()){if(target is InteractiveObject){ break; }}
            if(target !== null)
            {
                var local:Point = target.globalToLocal(new Point(x, y));
                var e:MouseEvent = new MouseEvent(
                    MouseEvent.CLICK, true, false, local.x, local.y);
                target.dispatchEvent(e);
            }
        }
    }
}

小さなデモ: その下にボタン配列がある Javascript イベントイーター。

于 2014-09-11T12:29:30.353 に答える
1

この場合、iframe にいるかどうかは関係ないと思います。Flash から基になる HTML ページへのパススルー クリックが必要であることを正しく理解していれば、クリックが何らかの条件を満たさない場合に限ります (この場合は、黒い斑点を超えていない場合のみ)。

アプローチは、iframe の Flash 部分と JavaScript 部分の間で共同で行うことです。

于 2014-09-11T07:24:14.703 に答える