Flash TextField HTML - Как предотвратить диалог ошибки для отсутствующих изображений? (Ошибка № 2044: необработанный IOErrorEvent:. Text = Ошибка № 2035: URL не найден) - PullRequest
1 голос
/ 21 ноября 2008

Я использую элемент управления Flash TextField для отображения некоторого содержимого HTML внутри презентации Flash, которое будет отображаться в большом киоске с сенсорным экраном. К сожалению, если какой-либо тег изображения в отображаемом контенте HTML указывает на несуществующее изображение, отображается диалог с сообщением об ошибке

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

Я пытаюсь избежать появления этого диалога. решение для загрузки контента через класс загрузчика - перехватить 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 ]

5 голосов
/ 28 мая 2009

Вы можете добавить идентификаторы к изображениям

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

И затем установите обработчик IOErrorEvent для каждого изображения в HTML

var loader:Loader = html.getImageReference("image") as Loader;
if(loader){
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void{});
}
2 голосов
/ 08 декабря 2008

Это крутая проблема.

У меня есть два предложения.

1) Не используйте TextField. Я предполагаю, что вы разрабатывали во Flash до Flex, как я. Возможно, вы уже знаете это, но мне потребовалось некоторое время, чтобы выяснить: объект TextField не предназначен для регулярного использования во Flex. Проверьте это с языком Flex3 ref:

Класс TextField используется для создания отображать объекты для отображения текста и вход. Весь динамический и вводимый текст поля в SWF-файле являются экземплярами класс TextField. Вы можете использовать Класс TextField для выполнения низкого уровня рендеринг текста. Однако во Flex вы обычно используют метку, текст, Элементы управления TextArea и TextInput для обработать текст.

Очевидно, что в использовании TextField нет ничего плохого, но я обнаружил, что когда я пытаюсь разобраться в хитрых проблемах, очень полезно сделать как можно больше «по книге», чтобы удалить неизвестных по возможности, как минимум).

2) Думаю, я бы попытался либо расширить компонент Text, либо создать новый компонент на основе Text. В этом компоненте я бы добавил логику для загрузки и вставки изображений в объект TextField. Таким образом, вы можете легко построить и проверить строку для вставки в объект TextField перед вставкой ее в TextField.

Если у вас все получится, пожалуйста, напишите - я мог бы использовать это сам. :)

1 голос
/ 21 октября 2011
 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..
1 голос
/ 03 февраля 2010

Мне удалось определить, когда изображение загружено, но я думаю, что последую совету TLF. В любом случае, если вам нужно знать, вы должны реализовать прослушиватель события enter_frame в Loader и проверить для contentInfo в свойстве bytes длина, если длина изображения не загружена, это 0xffffffff, если изображение загружено, длина равна размер файла, а в случае ошибки свойства байтов равны NULL.

1 голос
/ 14 января 2010

Если есть способ использовать новые компоненты FTE / TLF, сделайте это. Adobe в основном отказывается от старого API TextField, и эта же ошибка является причиной того, что мне пришлось отказаться от многих проектов и компонентов в прошлом. Эта ошибка выдается и в принципе не может быть поймана. Один из худших аспектов работы Flash на мой взгляд.

TLF решает эти проблемы и с ним гораздо проще работать. То, что заняло бы несколько дней экспериментов со старым API, теперь занимает всего несколько часов. Я построил несколько расширенных текстовых редакторов на новом API, и это очень приятно использовать. Вы будете рады, что сделали :) 1003 *

0 голосов
/ 14 января 2010

Невозможно! Та же проблема, если вы используете загрузчик для загрузки изображений, которые не существуют! Flex является фреймворком, и класс Image использует этот объект Flash Loader, но с большим количеством строк кода (см. Источник SwfLoader ...).

Вы можете проверить URL своего изображения перед установкой свойства htmlText или создать собственный компонент для отображения текста и изображений.

Я не могу поверить, что эта простая и глупая ошибка все еще не исправлена ​​Adobe!

0 голосов
/ 01 декабря 2008

С этой проблемой я тоже сталкиваюсь: это настоящее раздражение. Я действительно хотел бы быть в состоянии отловить все ошибки. Я предположил, что вы могли бы сказать ...

stage.addEventListener(IOError.IO_ERROR, myErrorHandler);

... но это, похоже, не работает, как вы указали.

Возможно, вы можете проверить, что флэш-плеер киоска не является отладочной версией. Я не думаю, что версия выпуска бросает диалоги (может быть неправильно).

...