0

この問題により、私は髪を引き裂いています。

症状: ポップアップが断続的にブロックされたり、外部インターフェイスと navigateToURL の組み合わせから通過したりします。

問題: Flash (またはブラウザ..不明) では、時間範囲外および/またはイベント期間外にポップアップがトリガーされません。

環境: zendAMF 経由でデータを送信し、何らかの処理を行って、フラッシュ プレーヤーに送り返す必要があるアプリがあります。応答で、特定の条件が満たされている場合は、ポップ オープン ウィンドウをトリガーします。応答時にブロックされる同じコードは、マウス イベント トリガーから直接動作します。

だから私は基本的な状況を設定しました: 6 つのボタン、3 つのメソッドを呼び出します。3 つのボタンはメソッドを直接呼び出し (すべてウィンドウを完全に開きます)、他の 3 つのボタンは数値ステッパーの値を取得し、setTimeout(openWinMethod, NumericStepper.value) を使用して zendAMF 応答からの遅延呼び出しをシミュレートします。

更新:最初に「navigateToURL、遅延なし」ボタンを選択した場合、そのウィンドウを閉じてから、他の遅延呼び出しを試してください-それらは機能します。ある時点でクリックしてウィンドウを開くことをブラウザが受け入れるように、遅延から呼び出すことができます。(Firefox のみ)

遅延を使用する 3 つすべてがブロックされますが (firefox と chrome)、3 つすべてが直接開きます。Safari - 十分に文書化されていますが、navigateToURL を使用する 2 つの方法でのみ機能します

興味深いことに、html ラッパーの js 関数は、ウィンドウを開くための外部インターフェイスとして呼び出されます。遅滞なく、これは機能しました。遅れて、js 関数が呼び出されます (いくつかのアラート ステートメントで確認されているように) が、新しいウィンドウが生成されることはありませんでした。

私が直面している 2 つのオプションがあります: 1 - zenAMF から応答を受け取ったら、ユーザーがクリックして続行する必要があるようにプロセスを変更するか、または 2 - これが発生している理由を見つけて修正します (推奨)。

デモはここにあります: http://www.digital.leskiwis.com/as3/popup/

ここに私のas3クラスがあります:

    package 
    {
        import fl.controls.Button;
        import fl.controls.NumericStepper;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.text.TextField;
        import flash.utils.*;
        import flash.net.*;
        import flash.external.ExternalInterface;



        public class Main extends Sprite
        {

            private var but1:Button;
            private var but2:Button;
            private var but3:Button;
            private var but4:Button;
            private var but5:Button;
            private var but6:Button;
            private var reporting:TextField;
            private var dlay:NumericStepper;
            private var url:String =  'http://www.google.com';
            private var target:String = "_blank";

            public function Main() 
            {       
                if (stage) init();
                else addEventListener(Event.ADDED_TO_STAGE, init);
            }


            private function init(e:Event = null):void 
            {
                removeEventListener(Event.ADDED_TO_STAGE, init);
                // entry point
                dlay = new NumericStepper()
                dlay.minimum = 0
                dlay.maximum = 5
                dlay.stepSize = 0.1
                addChild(dlay)

                but1 = new Button()
                but1.label = "External interface window.open, use delay"
                but1.addEventListener(MouseEvent.CLICK, onOpenDelay, false, 0, true);
                addChild(but1)
                but1.width = 300
                but1.y = 50;

                but2 = new Button()
                but2.label = "External interface window.open, no delay"
                but2.addEventListener(MouseEvent.CLICK, onOpen, false, 0, true);
                addChild(but2)
                but2.width = 300
                but2.y = 80;

                but5 = new Button()
                but5.label = "External interface JS, use delay"
                but5.addEventListener(MouseEvent.CLICK, onJSOpenDelay, false, 0, true);
                addChild(but5)
                but5.width = 300
                but5.y = 110;

                but6 = new Button()
                but6.label = "External interface JS, no delay"
                but6.addEventListener(MouseEvent.CLICK, onJSOpen, false, 0, true);
                addChild(but6)
                but6.width = 300
                but6.y = 140;

                but3 = new Button()
                but3.label = "Navigate to url, use delay"
                but3.addEventListener(MouseEvent.CLICK, onNavUrlDelay, false, 0, true);
                addChild(but3)
                but3.width = 300
                but3.y = 170;

                but4 = new Button()
                but4.label = "Navigate to url, no delay"
                but4.addEventListener(MouseEvent.CLICK, onNavUrl, false, 0, true);
                addChild(but4)
                but4.width = 300
                but4.y = 200;   

                reporting = new TextField;
                reporting.y = 230
                reporting.width = 300;
                reporting.height = 170
                addChild(reporting);

                }


                private function onOpen(e:MouseEvent = null):void {

                    ExternalInterface.call('window.open',url, 'myWin','height=700,width=900,toolbar=no,scrollbars=yes');    

                    tracer('opening window with window.open')

                }

                private function onOpenDelay(e:MouseEvent):void {

                    tracer(('opening window in ' + dlay.value + ' seconds...'))

                    setTimeout(onOpen, dlay.value * 1000)


                }

                private function onJSOpen(e:MouseEvent = null):void {

                    tracer('opening window with external js function ...')

                    var success : Boolean  = ExternalInterface.call( "openURL", url, target );

                    if (!success) tracer('pop up blocked..');

                }

                private function onJSOpenDelay(e:MouseEvent):void {

                    tracer(('opening js external in ' + dlay.value + ' seconds...'))

                    setTimeout(onJSOpen, dlay.value * 1000) 

                    //setTimeout(function():void { ExternalInterface.call( "openURL", url, target ); }, dlay.value * 1000)              

                }

                private function onNavUrl(e:MouseEvent = null):void {

                    tracer('opening with navigateToURL')

                    try {

                        navigateToURL( new URLRequest(url), '_blank');

                    } catch (e:Error) {

                        tracer("Error occurred! " + e);

                    }



                }

                private function onNavUrlDelay(e:MouseEvent):void {

                    tracer(('opening navigateToURL in ' + dlay.value + ' seconds...'))

                    setTimeout(onNavUrl, dlay.value * 1000)
                    //setTimeout(function():void { navigateToURL( new URLRequest(url), '_blank'); }, dlay.value * 1000)


                }

                private function tracer(msg:String):void {

                    trace(msg)
                    reporting.appendText(msg + '\n');

                }




        }

    }

ここにhtmlがあります:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
        <head>
            <title>popup test</title>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

            <script script language='JavaScript' type='text/javascript'>

                function openURL( url, target )
                {
                    try
                    {
                        var popup = window.open( url, target );
                        if ( popup == null ) 
                            return false;

                        if ( window.opera ) 
                            if (!popup.opera)
                                return false;
                    }

                    catch(err)
                    {
                        alert('errr...');
                        return false;
                    }
                    return true;
                }

            </script>   

            <script type="text/javascript" src="js/swfobject.js"></script>
            <script type="text/javascript">
                var flashvars = {};
                var params = {wmode:"opaque",allowScriptAccess:"always"};
                //var params = {allowScriptAccess:"sameDomain"};
                var attributes = {};
                attributes.id = "popupTest";
                attributes.name = "popupTest";
                swfobject.embedSWF("swf/popup2.swf", "altContent", "400", "400", "9.0.0", "swf/expressInstall.swf", flashvars, params, attributes);
            </script>



        </head>
        <body>

            <div id="altContent">


            </div>

        </body>
    </html>
4

1 に答える 1

0

これを読んでください:ユーザーインタラクションの要件

「ポップアップ ウィンドウ」の下に、externalInterface と navigatetoURL の両方が、ユーザー インタラクションのみに応答するものとしてリストされていることに注意してください。基本的に、時間がかかりすぎるスクリプトを実行している場合、実行していることはブロックされます。

このようなことをしようとしている場合は、外部ページ情報を呼び出して応答するjavascriptへのExternalInterface呼び出しを使用してから、フラッシュにブール値で応答するか、とにかくポップアップを開いて呼び出して応答させます外部ページ(そうでない場合はエラーメッセージなどを表示)。

あなたが本当にzendのものを使って何をしているかに正確に依存します。

于 2010-09-20T08:57:24.983 に答える