Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка в Mozilla при попытке загрузить несуществующую swf (http://www.flasher.ru/forum/showthread.php?t=117045)

Firefoxer 17.10.2008 13:25

Ошибка в Mozilla при попытке загрузить несуществующую swf
 
Выскакивает ошибка "Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.", когда флешка пытается загрузить отсутствующую на сервере другую флешку. Вопрос в том, как правильно обработать/обойти возникновение ошибки и избежать появление такого окошка в Mozilla (в других браузерах не появляется)?
Код:

var myLoader:Loader = new Loader();
var myRequest:URLRequest =  new URLRequest("...");
myLoader.load(myRequest);

Try...catch не помогли, либо неправильно использовал. Перехват IOErrorEvent вроде бы тоже никак не влияет.

Alex Lexcuk 17.10.2008 13:37

Так надо его URLLoader классом, там есть
ioErrorHandler
Код:

//куски документ класса
...
 my_url_img = "imag.jpg";
                sprite_creator();               
        }

        function menuItemSelectHandler(event:ContextMenuEvent):void {
                tool.x = mouseX;
                tool.y = mouseY+20;
        }

        //загрузочная функция
        function sprite_creator() {
                container = new Sprite();
                //addChild(container);
                loader = new URLLoader();///////////////////////////////////////////////////
                var pictURL:String = my_url_img;
                configureListeners(loader);
                var pictURLReq:URLRequest = new URLRequest(pictURL);
            try {
                loader.load(pictURLReq);
            } catch (error:Error) {
                trace("Unable to load requested document.");
            }

        }

        private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(Event.OPEN, openHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        }

        private function completeHandler(event:Event):void {
            var loader:URLLoader = URLLoader(event.target);
            trace("completeHandler: " + loader.data);
            var pictLdr:Loader = new Loader();
                    var pictURL:String = my_url_img;
                    var pictURLReq:URLRequest = new URLRequest(pictURL);
                    pictLdr.load(pictURLReq);
                    pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
                      function imgLoaded(event:Event):void {
                            container.addChild(pictLdr.content);
                                work_mc.addChild(container);
                        }
//            var vars:URLVariables = new URLVariables(loader.data);
//            trace("The answer is " + vars.answer);
//                        container.addChild(loader.content);
               
        }

        private function openHandler(event:Event):void {
            trace("openHandler: " + event);
        }

        private function progressHandler(event:ProgressEvent):void {
            trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
        }

        private function securityErrorHandler(event:SecurityErrorEvent):void {
            trace("securityErrorHandler: " + event);
        }

        private function httpStatusHandler(event:HTTPStatusEvent):void {
            trace("httpStatusHandler: " + event);
        }

        private function ioErrorHandler(event:IOErrorEvent):void {
            trace("ioErrorHandler: " + event);
        }

        //конец  загрузочная функция

выдает такое
Код:

httpStatusHandler: [HTTPStatusEvent type="httpStatus" bubbles=false cancelable=false eventPhase=2 status=0]
ioErrorHandler: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2032: Stream Error. URL: file:///D|/flash/AC3/Графика%20длинная%20линия/imag.jpg"]


Firefoxer 17.10.2008 14:22

Ошибки теперь нет, но никак не хочет отображаться подгружаемая флешка. Что здесь не так:
Код:

var myLoader3:URLLoader = new URLLoader();
var myRequest3:URLRequest =  new URLRequest("...");
myLoader3.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);                       
myLoader3.load(myRequest3);
mus.addChild(myLoader3.content);


etc 17.10.2008 14:58

Alex Lexcuk, внимательно читайте то, что спрашивают, а не вываливайте сразу тонну кривого кода (пусть даже с кусками из хелпа, это не отменяет его полнейшей кривости). И вообще, когда вы уже научитесь писать грамотный и стандартизированный код, а не учить своему чудо-синтаксису с подчеркиваниями и кодингу в кадрах?

URLLoader предназначен для загрузки текста, бинарных данных и т. п., но никак не для загрузки swf/png/jpg, кроме этого, он не является DisplayObject. Firefoxer, для отлова ошибки вам нужно подписаться на соответствующее событие.

Firefoxer 17.10.2008 15:02

Подозревал я, даже в хелпе ничего про возможность загрузки swf через URLLoader нет. Благодарю за бдительность, _etc.

В первом посте ошибся, действительно подписка на соответствующее событие спасает:
Код:

var myLoader3:Loader = new Loader();
var myRequest3:URLRequest =  new URLRequest("...");
myLoader3.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
try {
  myLoader3.load(myRequest3);
  mus.addChild(myLoader3);
} catch (error:Error) {               
}                       

private function ioErrorHandler(event:IOErrorEvent):void {
}


Alex Lexcuk 17.10.2008 15:51

Ну... Да Неужели никто не читал то, что напечатал я.
URLLoader просто грузит...она не отбражает ничего, если он загрузил (см. текст выше) то уж Loader загрузит и подавно.
Найдите 10 отличий, все работает... Отображается отлично gif, jpg, swf (не важно)
Код:

//Draw_doc_class
package {
        import flash.display.*;//библиотека объектов
        import flash.events.*;//библиотека событий
        import flash.text.*;//библиотека текста
        import flash.ui.*;
        import flash.system.System;
        import flash.net.*;
        import flash.utils.*;
        import flash.ui.*;

        dynamic public class Doc_class extends Sprite{;
        var loader:URLLoader;
        var container:Sprite;
        var my_url_img:String;
        var work_mc:Sprite;
        function Doc_class() {
                work_mc = this;
                my_url_img="http://www.dnadillo.dn.ua/fla/anim-spider.swf";
                sprite_creator();
        }

        //загрузочная функция
        function sprite_creator() {
                container=new Sprite  ;
                //addChild(container);
                loader=new URLLoader  ;///////////////////////////////////////////////////
                var pictURL:String=my_url_img;
                configureListeners(loader);
                var pictURLReq:URLRequest=new URLRequest(pictURL);
                try {
                        loader.load(pictURLReq);
                } catch (error:Error) {
                        trace("Unable to load requested document.");
                }

        }

        private function configureListeners(dispatcher:IEventDispatcher):void {
                dispatcher.addEventListener(Event.COMPLETE,completeHandler);
                dispatcher.addEventListener(Event.OPEN,openHandler);
                dispatcher.addEventListener(ProgressEvent.PROGRESS,progressHandler);
                dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
                dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
                dispatcher.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
        }

        private function completeHandler(event:Event):void {
                var loader:URLLoader=URLLoader(event.target);
                trace("completeHandler: " + loader.data);
                var pictLdr:Loader=new Loader;
                var pictURL:String=my_url_img;
                var pictURLReq:URLRequest=new URLRequest(pictURL);
                pictLdr.load(pictURLReq);
                pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE,imgLoaded);
                function imgLoaded(event:Event):void {
                        container.addChild(pictLdr.content);
                        work_mc.addChild(container);
                }
        }

        private function openHandler(event:Event):void {
                trace("openHandler: " + event);
        }

        private function progressHandler(event:ProgressEvent):void {
                trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
        }

        private function securityErrorHandler(event:SecurityErrorEvent):void {
                trace("securityErrorHandler: " + event);
        }

        private function httpStatusHandler(event:HTTPStatusEvent):void {
                trace("httpStatusHandler: " + event);
        }

        private function ioErrorHandler(event:IOErrorEvent):void {
                trace("ioErrorHandler: " + event);
        }

        //конец  загрузочная функция
}
}

Даже скомпили для вас 1.2 кБ
http://www.dnadillo.dn.ua/fla/Doc_loading.swf

Firefoxer 17.10.2008 16:03

Что-то я смысл конструкции не понимаю, начинаем грузить через URLLoader, показать не можем, т.к. не является DisplayObject, как выше сказал _etc, и заново качаем через Loader? Расчет на то, что возьмет из кэша? Аналогичное событие ошибки есть и в классе Loader, которым я и воспользовался в итоге, потому мне кажется излишними и даже неприемлимым подобное использование URLLoader, хотя и соглашусь с тем, что это может работать.

Alex Lexcuk 17.10.2008 16:23

Ну так я конечно не настаиваю, однако событие в вашем примере
Код:

myLoader3.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
private function ioErrorHandler(event:IOErrorEvent):void {
}

сработает только в случае вызова функции
Код:

myLoader3.load(myRequest3);
и если вставить trace
Код:

function ioErrorHandler(event:IOErrorEvent):void {
        trace("error");
}

и попытаться загрузить, то чего на самом деле нет
то мы увидим
Код:

Error opening URL 'http://www.dnadillo.dn.ua/fla/cat_.swf'
error

Вехний Error не наш, это точно и следовательно эта конструкция на чувствительном мозиловском движке работать не будет.

Firefoxer 17.10.2008 16:35

Я собственно и успокоился потому, что мой пример работает. Ошибки в мозилле больше нет.

Alex Lexcuk 17.10.2008 17:19

Виноват... тоже попробовал, только, что, работает отлично. Если кому-понадобится
отобразить именно из URLLoader то можно так
Код:

...
loader=new URLLoader  ;///////////////////////////////////////////////////
                var pictURL:String=my_url_img;
                configureListeners(loader);
                var pictURLReq:URLRequest=new URLRequest(pictURL);
                loader.dataFormat= URLLoaderDataFormat.BINARY;
                try {
                        loader.load(pictURLReq);
                } catch (error:Error) {
                        trace("Unable to load requested document.");
                }
                txt.text = 'Прикол';

        }

        private function configureListeners(dispatcher:IEventDispatcher):void {
                dispatcher.addEventListener(Event.COMPLETE,completeHandler);
                dispatcher.addEventListener(Event.OPEN,openHandler);
                dispatcher.addEventListener(ProgressEvent.PROGRESS,progressHandler);
                dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
                dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
                dispatcher.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
        }

        private function completeHandler(event:Event):void {
                var pictLdr:Loader=new Loader;
                pictLdr.loadBytes(loader.data);
            this.addChild(pictLdr);
        }
...


etc 17.10.2008 17:47

Alex Lexcuk, боже мой, нафига вам URLLoader-то? Ну зачем, а? loadBytes прикрутили, бог знает что. После этого вы ещё и такие «примеры» на всеобщее обозрение выкладываете.

з. Ы.: Про совершенно кривейший код в целом я вообще не говорю.

foreground 11.11.2008 00:20

Уважаемому __etc
 
Уважаемому __etc,
А вы можете объяснить что тут незаконного, в подгузке swf в бинарном виде? :confused:

etc 11.11.2008 00:29

foreground, незаконного ничего нет, просто в такой задаче использование loadBytes и URLLoader — бессмысленное усложнение задачи до упора.
Потом такие примеры кода, любезно предоставленные товарищами, вроде Alex Lexcuk, расползаются по интернету и появляются быдлокодеры, которые подобными затейливыми конструкциями решают простые задачи, а сложные так вообще не в состоянии. Получается дефицит толковых ActionScript-программистов.

foreground 11.11.2008 02:57

Цитата:

появляются быдлокодеры
будем надеяться я не один из них :umnik2:.

Дело в том что я попытался сделать свой queue загрузчик. с использованием URLLoader.
Локально всё замечательно грузилось и находилось ). А как только положил всё на сервер получил
Код:

ioError: "Error #2032: Stream Error. URL: ....".
Причем только для BINARY.
Сюда (http://www.actionscripterrors.com/?s=2032) залез ничего толкового не вычитал.
Может есть нормальное решение?

iNils 11.11.2008 10:25

Код:

package {
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.URLRequest;

    public class LoaderInfoExample extends Sprite {
        private var url:String = "Image.gif";

        public function LoaderInfoExample() {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            var request:URLRequest = new URLRequest(url);
            loader.load(request);
            addChild(loader);
        }

        private function initHandler(event:Event):void {
            var loader:Loader = Loader(event.target.loader);
            var info:LoaderInfo = LoaderInfo(loader.contentLoaderInfo);
            trace("initHandler: loaderURL=" + info.loaderURL + " url=" + info.url);
        }

        private function ioErrorHandler(event:IOErrorEvent):void {
            trace("ioErrorHandler: " + event);
        }
    }
}


foreground 11.11.2008 13:00

iNils
Да я понимаю что можно и Loader-ом загрузить. . просто вопрос-то не в этом. URLLoader поддерживает BINARY - значит должен грузить.

etc 11.11.2008 16:54

foreground, а BINARY вам для каких целей-то? Грузить swf-ки? Зачем?

foreground 11.11.2008 18:07

__etc,
ну мне надо не один файл загрузить, а много разного. . и есть разные форматы и есть профайл откуда грузить. Вобще странно слышать "Грузить swf-ки? Зачем?" )). Я подозреваю проблемма с загрузкой именно в секьюрности. На родительском домене отсутствует crossdomain.xml. Как обойти этот недостаток не понимаю.

Добавлено через 48 часов 21 минуту
Пишу ответ для свежего программистского флэш-сообщесва.
Если у таких уважаемых людей как __etc (которые замечу занимались и сами когда-то парсингом swf) появится комментарий, - ради бога. :away:
Нерабочее соединение:
Код:

Server: Apache/2.2.9 (FreeBSD) PHP/5.2.6 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.7e-p1
Рабочее соединение:
Код:

Server: Apache
Плеер 9.0.124.0


Часовой пояс GMT +4, время: 10:41.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.