flex form - Flash TextField HTML - Wie verhindere ich den Fehlerdialog für fehlende Bilder? (Fehler # 2044: Unbehandeltes IOErrorEvent :. text = Fehler # 2035: URL nicht gefunden)




4 Answers

Sie können IDs zu Bildern hinzufügen

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

Dann richten Sie den IOErrorEvent-Handler für jedes Bild in HTML ein

var loader:Loader = html.getImageReference("image") as Loader;
if(loader){
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void{});
}
input type

Ich verwende ein Flash TextField-Steuerelement, um einige HTML-Inhalte in einer Flash-Präsentation anzuzeigen, die auf einem großen Touchscreen-Kiosk angezeigt werden. Wenn ein Bild-Tag im angezeigten HTML-Inhalt auf ein nicht vorhandenes Bild verweist, wird ein Dialog mit der Fehlermeldung angezeigt

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

Ich versuche zu vermeiden, dass dieser Dialog auftaucht. Die Lösung zum Laden von Inhalt durch eine Loader-Klasse ist IOErrorEvent.IO_ERROR zu fangen, aber ich habe versucht, auf dem TextField, auf der Bühne, Main und loaderInfo, ohne Erfolg zu hören. Ich habe versucht, die ganze Sache in einen Versuch zu fangen, und das funktioniert auch nicht.

Hier ist der vereinfachte Code, den ich verwende, um Lösungen zu finden:

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);
        }
    }
}

Edit: Und hier ist der gesamte Arbeitscode.

Für dynamische Inhalte usw. benötigen Sie natürlich eine Liste mit Bildern und eine Funktion zum Generieren von Handlern usw.

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);
        }
    }
}



Wenn Sie die neuen FTE / TLF-Komponenten verwenden können, tun Sie dies. Adobe wendet sich im Grunde genommen von der alten TextField-API ab, und dieser Fehler ist ein Grund, weshalb ich in der Vergangenheit viele Projekte und Komponenten aufgeben musste. Dieser Fehler wird ausgelöst und kann grundsätzlich nicht abgefangen werden. Einer der schlimmsten Aspekte von Flash funktioniert meiner Meinung nach.

TLF adressiert diese Probleme und ist so viel einfacher zu bearbeiten. Was in der alten API mehrere Tage dauern würde, dauert jetzt nur noch ein paar Stunden. Ich habe ein paar Rich-Text-Editoren auf der neuen API erstellt und es ist SO sehr schön zu verwenden. Du wirst froh sein, dass du es getan hast :)




 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..



Unmöglich! Das gleiche Problem, wenn Sie den Loader verwenden, um Bilder zu laden, die nicht existieren! Flex ist ein Framework und die Image-Klasse verwendet dieses flash-Loader-Objekt, aber mit vielen Codezeilen (siehe die Quelle von SwfLoader ...).

Sie können Ihre Bild-URL überprüfen, bevor Sie die Eigenschaft htmlText festlegen, oder Sie können eine eigene Komponente erstellen, um Text und Bilder anzuzeigen.

Ich kann nicht glauben, dass dieser einfache und dumme Bug von Adobe noch nicht behoben wurde!




Related

flex flash actionscript-3 actionscript flex3