1

Flash TextField コントロールを使用して、Flash プレゼンテーション内に HTML コンテンツを表示し、大きなタッチ スクリーン キオスクに表示しています。残念ながら、表示された HTML コンテンツ内の画像タグが存在しない画像を指している場合、ダイアログにエラー メッセージが表示されます。

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

そのダイアログがポップアップするのを避けようとしています。ローダー クラスを介してコンテンツをロードするための解決策IOErrorEvent.IO_ERRORは catchですが、TextField、ステージ、Main、および loaderInfo でそれをリッスンしようとしましたが、役に立ちませんでした。すべてをtry-catchでラップしようとしましたが、それも機能しません。

解決策を見つけるために使用している簡略化されたコードは次のとおりです。

package {
    import flash.display.Sprite;
    import flash.errors.IOError;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.text.TextField;
    import flash.text.TextFieldType;

    public class Main extends Sprite {

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

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var html:TextField = new TextField();
            html.type = TextFieldType.DYNAMIC;
            html.multiline = true;
            html.htmlText = "Bogus image: <img src=\"foo.jpg\" />";         

            addChild(html);
        }
    }
}

編集:そして、これが作業コード全体です。

もちろん、動的コンテンツなどの場合は、画像のリストとハンドラーを生成する関数などが必要です。

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.errors.IOError;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.text.TextField;
    import flash.text.TextFieldType;

    public class Main extends Sprite {

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

        private function init(e:Event = null):void {
                removeEventListener(Event.ADDED_TO_STAGE, init);

                var html:TextField = new TextField();
                html.type = TextFieldType.DYNAMIC;
                html.multiline = true;
                html.htmlText = "Bogus image: <img id=\"image\" src=\"foo.jpg\" />";                 

                var loader:Loader = html.getImageReference("image") as Loader;
                if(loader){         
                    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void {
                            trace("Error loading foo.jpg!");
                        });
                }               

                addChild(html);
        }
    }
}
4

7 に答える 7

5

画像に ID を追加できます

html.htmlText = "Bogus image: <img src=\"foo.jpg\" id="image" />"; 

そして、HTMLの各画像にIOErrorEventハンドラを設定します

var loader:Loader = html.getImageReference("image") as Loader;
if(loader){
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void{});
}
于 2009-05-27T20:54:15.607 に答える
2

これはクールな問題です。

2つの提案があります。

1) TextField を使用しないでください。私のように、あなたは Flex の前に Flash で開発したと思います。すでにご存知かもしれませんが、私が気付くまでにしばらく時間がかかりました: TextField オブジェクトは、Flex での通常の使用を意図したものではありません。Flex3 言語リファレンスからこれを確認してください。

TextField クラスは、テキストの表示および入力用の表示オブジェクトを作成するために使用されます。SWF ファイル内の動的テキスト フィールドと入力テキスト フィールドはすべて、TextField クラスのインスタンスです。TextField クラスを使用して、低レベルのテキスト レンダリングを実行できます。ただし、Flex では通常、Label、Text、TextArea、および TextInput コントロールを使用してテキストを処理します。

明らかに、TextField の使用に問題はありませんが、トリッキーな問題を理解しようとするとき、未知のものを取り除くためにできる限り「本に従って」行うことが非常に役立つことがわかりました (可能な限り、少なくとも)。

2) Text コンポーネントを拡張するか、Text に基づいて新しいコンポーネントを作成してみようと思います。このコンポーネントでは、TextField オブジェクトに画像を読み込んで挿入するロジックを追加します。そうすれば、TextField に挿入する前に、TextField オブジェクトに挿入する文字列を簡単に作成および検証できます。

これが機能する場合は、投稿してください-私はそれを自分で使用できます。:)

于 2008-12-08T16:35:03.783 に答える
1

新しい FTE/TLF コンポーネントを使用する方法がある場合は、そうしてください。Adobe は基本的に古い TextField API に背を向けています。これと同じエラーが原因で、過去に多くのプロジェクトやコンポーネントを放棄しなければなりませんでした。このエラーはスローされ、基本的にキャッチできません。私の意見では、Flash の最悪の側面の 1 つです。

TLF はこれらの問題に対処し、作業が非常に簡単です。古い API では何日もかかっていた実験が、今では数時間しかかかりません。新しい API でいくつかのリッチ テキスト エディターを作成しましたが、とても使いやすいです。あなたはあなたがしたことをうれしく思います:)

于 2010-01-14T19:48:34.430 に答える
1
 var html:TextField = new TextField();
   html.width=388.95;
   html.height=400;
   html.type = TextFieldType.DYNAMIC;
   html.multiline = true;
   html.htmlText = "Bogus image: <img id='image' src='foo.jpg'/>";                 
   var loader:Loader = html.getImageReference("image") as Loader;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHan);
function completeHan(e:Event){
    addChild(html);
}

This will work..
于 2011-10-21T19:26:37.320 に答える
1

画像がロードされたことを検出できましたが、TLF のアドバイスに従うと思います。とにかく、知る必要がある場合は、ローダーに enter_frame イベントリスナーを実装し、長さのバイトプロパティで contentInfo を確認する必要があります。画像が読み込まれていない場合、長さは 0xffffffff です。画像が読み込まれている場合、長さはファイルのサイズ。エラーが発生した場合、bytes プロパティは NULL になります。

于 2010-02-03T00:14:06.593 に答える
-1

不可能!ローダーを使用して存在しない画像をロードする場合も同じ問題が発生します。Flexはフレームワークであり、Imageクラスはこのフラッシュローダーオブジェクトを使用しますが、コード行がたくさんあります(SwfLoaderのソースを確認してください...)。

htmlTextプロパティを設定する前に画像のURLを確認するか、独自のコンポーネントを作成してテキストと画像を表示することができます。

この単純で愚かなバグがまだアドビによって修正されていないなんて信じられません!

于 2010-01-14T19:44:01.877 に答える
-1

これは私も扱っている問題です。本当に厄介です。すべてのエラーをキャッチできるようになりたいです。私はあなたが言うことができると思いました...

stage.addEventListener(IOError.IO_ERROR, myErrorHandler);

...しかし、あなたが指摘したように、それはうまくいかないようです。

おそらく、キオスクのフラッシュ プレーヤーがデバッグ バージョンではないことを確認できます。リリース バージョンではダイアログが表示されないと思います (間違っている可能性があります)。

于 2008-12-01T02:42:18.963 に答える