Flash TextField HTML - 如何防止错误对话丢失图像? (错误#2044:未处理的IOErrorEvent:。text =错误#2035:找不到URL)

时间:2008-11-21 18:33:22

标签: flex flash actionscript-3 actionscript flex3

我正在使用Flash TextField控件在Flash演示文稿中显示一些HTML内容,以便在大型触摸屏自助服务终端上显示。遗憾的是,如果显示的HTML内容中的任何图像标记指向不存在的图像,则会显示带有错误消息的对话框

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

我试图避免弹出对话框。通过加载器类加载内容的solution是捕获IOErrorEvent.IO_ERROR,但我已经尝试在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);
        }
    }
}

7 个答案:

答案 0 :(得分: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{});
}

答案 1 :(得分:2)

这是一个很酷的问题。

我有两个建议。

1)不要使用TextField。我猜你是在Flex之前用Flash开发的,就像我一样。您可能已经知道了这一点,但我花了一些时间才发现:TextField对象并不打算用于Flex中的常规用法。从Flex3语言参考:

中查看
  

TextField类用于创建   显示文本显示对象和   输入。所有动态和输入文本   SWF文件中的字段是。的实例   TextField类。你可以使用   TextField类执行低级别   文字呈现。但是,在Flex中,你   通常使用Label,Text,   TextArea和TextInput控件   过程文本。

显然,使用TextField并没有什么不妥,但是我发现当我试图弄清楚棘手的问题时,尽可能多地“按书”去做,以消除未知数(尽可能多尽可能,至少)。

2)我想我会尝试扩展Text组件,或者根据Text创建一个新组件。在这个组件中,我添加了加载逻辑并将图像插入TextField对象。这样,您可以在将字符串插入TextField之前轻松构建和验证要插入TextField对象的字符串。

如果你有这个工作,请发布 - 我可以自己使用它。 :)

答案 2 :(得分:1)

如果您有办法使用新的FTE / TLF组件,请执行此操作。 Adobe基本上背弃了旧的TextField API,同样的错误也是我过去不得不放弃许多项目和组件的原因。抛出此错误,基本上无法捕获。在我看来,Flash工作最糟糕的一个方面。

TLF解决了这些问题,并且更容易使用。旧API中需要几天的实验才需要几个小时。我在新API上构建了一些富文本编辑器,它非常好用。你会很高兴你做到了:))

答案 3 :(得分:1)

我能够检测到图像何时加载,但我想我会遵循TLF的建议。无论如何你需要知道,你必须在Loader上实现一个enter_frame事件监听器并检查lenght的bytes属性上的contentInfo,如果图像没有加载长度是0xffffffff,如果图像加载了长度是文件的大小,如果有错误,则字节属性为es NULL。

答案 4 :(得分: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..

答案 5 :(得分:-1)

这是我正在处理的一个问题:这是一个真正的烦恼。我真的希望能够捕捉到所有的错误。我以为你可以说...

stage.addEventListener(IOError.IO_ERROR, myErrorHandler);

......但是,正如你所指出的那样,这似乎不起作用。

也许您可以检查以确保自助服务终端的Flash播放器不是调试版本。我不认为发布版本会抛出对话框(可能是错误的)。

答案 6 :(得分:-1)

不可能!如果您使用Loader加载不存在的图像,也会出现同样的问题! Flex是一个框架,Image类使用这个flash Loader对象,但有很多行代码(查看SwfLoader的源代码......)。

您可以在设置htmlText属性之前检查图像URL,也可以创建自己的组件以显示文本和图像..

我无法相信这个简单的&amp;愚蠢的bug还没有被Adobe修复!