Как я могу проверить URL-адрес SWF перед загрузкой стилей из if (или обнаружением ошибки)?

Я пытаюсь использовать следующий код для загрузки стилей из внешнего SWF, но продолжаю получать ошибку ActionScript, когда URL-адрес недействителен:

Error: Unable to load style(Error #2036: Load Never Completed. URL: http://localhost/css/styles.swf): ../css/styles.swf.
at <anonymous>()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\styles\StyleManagerImpl.as:858] 


private function loadStyles(): void
{
    try
    {
        var styleEvent:IEventDispatcher = 
            StyleManager.loadStyleDeclarations("../styles.swf");

        styleEvent.addEventListener(StyleEvent.COMPLETE, 
                                                    loadStyle_completeHandler);

        styleEvent.addEventListener(StyleEvent.ERROR, 
                                                    loadStyle_errorHandler);
    }
    catch (error:Error)
    {
        useDefault();
    }
}

private function loadStyle_completeHandler(event:StyleEvent): void
{
    IEventDispatcher(event.currentTarget).removeEventListener(
        event.type, loadStyle_completeHandler);

    goToNextStep();
}

private function loadStyle_errorHandler(event:StyleEvent): void
{
    IEventDispatcher(event.currentTarget).removeEventListener(
        event.type, loadStyle_errorHandler);

    useDefault();
}

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

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
2 040
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Интересная проблема. Попробуйте удалить вызов removeEventListener или закомментировать его; в моих кратких тестах выяснилось, что обработчик событий вызывался дважды (я не сразу понимаю, почему, хотя подозреваю, что это связано с наследованием стилей), и комментарий к этой строке помог.

Если у вас такой же результат, вы можете попробовать сначала просто проверить прослушиватель (используя hasEventListener), прежде чем прикреплять его к функции loadStyles (). Надеюсь, поможет!

** Не ответ, а обновление:

К вашему сведению, это код ActionScript в источнике mx.styles.StyleManagerImpl, который запускается при вызове StyleManager.loadStyleDeclarations (). Я запустил отладчик и добавил точку останова в Строке 858 («выбросить новую ошибку (errorText);»), и точка останова была поймана. Я думаю, что это не должно быть там поймано, но вместо этого должен выполняться предыдущий IF ("if (styleEventDispatcher.willTrigger (StyleEvent.ERROR))").

public function loadStyleDeclarations2(
                    url:String, update:Boolean = true,
                    applicationDomain:ApplicationDomain = null,
                    securityDomain:SecurityDomain = null):
                    IEventDispatcher
{
    var module:IModuleInfo = ModuleManager.getModule(url);

    var readyHandler:Function = function(moduleEvent:ModuleEvent):void
    {
        var styleModule:IStyleModule =
            IStyleModule(moduleEvent.module.factory.create());

        styleModules[moduleEvent.module.url].styleModule = styleModule;

        if (update)
            styleDeclarationsChanged();
    };

    module.addEventListener(ModuleEvent.READY, readyHandler,
                            false, 0, true);

    var styleEventDispatcher:StyleEventDispatcher =
                                    new StyleEventDispatcher(module);

    var errorHandler:Function = function(moduleEvent:ModuleEvent):void
    {
        var errorText:String = resourceManager.getString(
            "styles", "unableToLoad", [ moduleEvent.errorText, url ]);

        if (styleEventDispatcher.willTrigger(StyleEvent.ERROR))
        {
            var styleEvent:StyleEvent = new StyleEvent(
                StyleEvent.ERROR, moduleEvent.bubbles, moduleEvent.cancelable);
            styleEvent.bytesLoaded = 0;
            styleEvent.bytesTotal = 0;
            styleEvent.errorText = errorText;
            styleEventDispatcher.dispatchEvent(styleEvent);
        }
        else
        {
            throw new Error(errorText);
        }
    };

    module.addEventListener(ModuleEvent.ERROR, errorHandler,
                            false, 0, true);

    styleModules[url] =
        new StyleModuleInfo(module, readyHandler, errorHandler);

    // This Timer gives the loadStyleDeclarations() caller a chance
    // to add event listeners to the return value, before the module
    // is loaded.
    var timer:Timer = new Timer(0);
    var timerHandler:Function = function(event:TimerEvent):void
    {
        timer.removeEventListener(TimerEvent.TIMER, timerHandler);
        timer.stop();
        module.load(applicationDomain, securityDomain);
    };

    timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);

    timer.start();

    return styleEventDispatcher;
}
Ответ принят как подходящий

Я отладил источник и обнаружил, что событие ERROR является запускается дважды. Итак, я просто устанавливаю флаг при первом запуске обработчика события ERROR и проверяю этот флаг на значение true, прежде чем продолжить:

private var isErrorTriggered:Boolean; // Default is false

private function loadStyle_completeHandler(event:StyleEvent):void
{
    IEventDispatcher(event.currentTarget).removeEventListener(
        event.type, loadStyle_completeHandler);

    goToNextStep();
}

private function loadStyle_errorHandler(event:StyleEvent):void
{
    if (isErrorTriggered)
        return;

    isErrorTriggered = true;

    useDefault();
}

Другие вопросы по теме