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


Answers

Das ist ein cooles Problem.

Ich habe zwei Vorschläge.

1) Verwenden Sie kein TextField. Ich nehme an, dass Sie in Flash vor Flex entwickelt haben, wie ich. Vielleicht wissen Sie das bereits, aber ich habe eine Weile gebraucht, um es herauszufinden: Das TextField-Objekt ist nicht dafür vorgesehen, regelmäßig in Flex verwendet zu werden. Überprüfen Sie dies in der Flex3-Sprache:

Die TextField-Klasse wird zum Erstellen von Anzeigeobjekten für die Textanzeige und -eingabe verwendet. Alle dynamischen und Eingabetextfelder in einer SWF-Datei sind Instanzen der TextField-Klasse. Sie können die TextField-Klasse zum Ausführen von Text auf niedriger Ebene verwenden. In Flex verwenden Sie jedoch normalerweise die Steuerelemente Label, Text, TextArea und TextInput, um Text zu verarbeiten.

Natürlich ist nichts falsch daran, TextField zu verwenden, aber ich habe herausgefunden, dass es sehr hilfreich ist, wenn ich versuche, knifflige Probleme zu lösen, so viel wie möglich, um Unbekannte zu entfernen (so viel wie möglich, mindestens).

2) Ich würde versuchen, entweder die Text-Komponente zu erweitern oder eine neue Komponente basierend auf Text zu erstellen. In dieser Komponente würde ich Logik hinzufügen, um Bilder in das TextField-Objekt zu laden und einzufügen. Auf diese Weise können Sie die Zeichenfolge, die Sie in das TextField-Objekt einfügen möchten, einfach erstellen und validieren, bevor Sie sie in das TextField einfügen.

Wenn du das funktionierst, bitte posten - ich könnte es selbst benutzen. :)

Question

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



Ich konnte feststellen, wenn ein Bild geladen wurde, aber ich denke, ich werde dem TLF-Rat folgen. Wie auch immer, wenn Sie es wissen müssen, müssen Sie einen enter_frame Ereignis-Listener auf dem Loader implementieren und nach der contentInfo auf der Eigenschaft bytes die Länge suchen, wenn das Bild nicht geladen ist, ist die Länge 0xffffffff, wenn das Bild geladen ist die Länge ist die Größe der Datei, und wenn es einen Fehler gibt, ist die Byte-Eigenschaften NULL.




Dies ist ein Problem, mit dem ich mich auch beschäftige: Es ist ein echter Ärger. Ich würde wirklich gerne alle Fehler abfangen können. Ich nahm an, du könntest sagen ...

stage.addEventListener(IOError.IO_ERROR, myErrorHandler);

... aber das scheint nicht zu funktionieren, wie Sie gesagt haben.

Vielleicht können Sie überprüfen, ob der Flash-Player des Kiosk nicht die Debug-Version ist. Ich glaube nicht, dass die Release-Version die Dialoge wirft (könnte falsch sein).




Related