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

这是一个很酷的问题。

我有两个建议。

1)不要使用文本字段。我猜你和我一样是在 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 工作最糟糕的方面之一。

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

于 2010-01-14T19:48:34.430 回答
1

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

于 2010-02-03T00:14:06.593 回答
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

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

stage.addEventListener(IOError.IO_ERROR, myErrorHandler);

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

也许您可以检查以确保信息亭的 Flash 播放器不是调试版本。我不认为发布版本会引发对话框(可能是错误的)。

于 2008-12-01T02:42:18.963 回答
-1

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

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

我不敢相信这个简单而愚蠢的错误仍然没有被 Adob​​e 修复!

于 2010-01-14T19:44:01.877 回答