代码之家  ›  专栏  ›  技术社区  ›  Jesse Millikan

flash textfield html-如何防止丢失图像的错误对话框?(错误2044:未处理的IOErrorEvent:。text=错误2035:找不到URL)

  •  1
  • Jesse Millikan  · 技术社区  · 16 年前

    我使用一个flash textfield控件来显示flash演示文稿中的一些HTML内容,这些内容将显示在一个大的触摸屏亭中。不幸的是,如果所显示的HTML内容中的任何图像标记指向不存在的图像,则会显示一个带有错误消息的对话框。

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

    我尽量避免弹出对话。这个 solution 对于通过加载程序类加载内容的方法是 IOErrorEvent.IO_ERROR 但是我在textfield、stage、main和loaderinfo上尝试过听,但没有用。我试过用试扣把整个东西包起来,但这也不管用。

    下面是我用来寻找解决方案的简化代码:

    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 回复  |  直到 9 年前
        1
  •  5
  •   a_w    16 年前

    您可以将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{});
    }
    
        2
  •  2
  •   Ross Henderson    16 年前

    这是个很酷的问题。

    我有两个建议。

    1)不要使用文本字段。我猜你和我一样,是在flex之前用flash开发的。您可能已经知道这一点,但我花了一段时间才发现:textfield对象并不打算在flex中经常使用。请参阅flex3语言参考:

    textfield类用于创建 显示文本显示对象和 输入。所有动态和输入文本 SWF文件中的字段是 textfield类。你可以使用 执行低级的textfield类 文本呈现。但是,在flex中, 通常使用标签、文本, 文本区域和文本输入控件 处理文本。

    显然,使用textfield没有任何问题,但我发现,当我试图解决棘手的问题时,尽可能多地“按书”删除未知内容(至少尽可能多地)确实很有帮助。

    2)我想我可以尝试扩展文本组件,或者基于文本创建一个新组件。在这个组件中,我将添加逻辑来加载图像并将其插入到textfield对象中。这样,在将字符串插入到textfield对象之前,您可以轻松地构建和验证要插入到textfield对象中的字符串。

    如果你能做到这一点,请邮寄-我可以自己用。:)

        3
  •  1
  •   Naftuli Kay    15 年前

    如果您可以使用新的FTE/TLF组件,那么就这样做。Adobe基本上已经不再使用旧的textfield API了,同样的错误也是我过去不得不放弃许多项目和组件的原因。此错误被抛出,基本上无法捕获。在我看来,Flash工作最糟糕的方面之一。

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

        4
  •  1
  •   BUabco    15 年前

    我可以检测到什么时候加载了图像,但我想我会遵循TLF的建议。无论如何,如果您需要知道,您必须在加载程序上实现一个输入帧事件侦听器,并检查bytes属性length的contentinfo,如果图像没有加载,则长度为0xffffffff,如果图像已加载,则长度为文件的大小,如果出现错误,则bytes属性为空。

        5
  •  1
  •   ganesh    13 年前
     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..
    
        6
  •  -1
  •   aaaidan    16 年前

    这也是我要处理的一个问题:这真的很烦人。我真的很想抓住所有的错误。我以为你会说…

    stage.addEventListener(IOError.IO_ERROR, myErrorHandler);
    

    …但正如你所指出的,这似乎行不通。

    也许您可以检查一下,以确保亭的flash播放器不是调试版本。我不认为发布版本会抛出对话框(可能是错误的)。

        7
  •  -1
  •   eBuildy    15 年前

    不可能的!如果使用加载程序加载不存在的图像,则会出现同样的问题!flex是一个框架,image类使用这个flash加载器对象,但有大量的代码行(请查看swfloader的源代码…)。

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

    我不敢相信这个简单而愚蠢的bug还没有被Adobe修复!

    推荐文章