Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   У объекта Sound не срабатывает событие onLoad (http://www.flasher.ru/forum/showthread.php?t=116900)

egrik 13.10.2008 18:57

У объекта Sound не срабатывает событие onLoad
 
Добрый день, кто-нибудь объясните, плиз, на простом примере следующую ситуацию:

Код:

_root.onEnterFrame = function():Void
{
        delete this.onEnterFrame;
        var t = new Sound();
        t.onLoad = function(a):Void
        {
                trace(a);
        }
        t.loadSound('data/snd/bg.mp3', false);
}

Почему в этом случае не срабаывает событие onLoad? Также удивительно то, что если мп3 файла не существует, то событие срабатывает.

Еще момент, если: будет так:

Код:

var t = new Sound();
_root.onEnterFrame = function():Void
{
        delete this.onEnterFrame;
        t.onLoad = function(a):Void
        {
                trace(a);
        }
        t.loadSound('data/snd/bg.mp3', false);
}

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

Заранее всем огромнооооое спасибо )

Mnilionic 13.10.2008 19:06

вы удаляете функцию, в кототрой у вас что-то должно сработать :)

egrik 13.10.2008 19:40

Цитата:

Сообщение от Mnilionic (Сообщение 770111)
вы удаляете функцию, в кототрой у вас что-то должно сработать :)

нет, в данном случаем я изменил область видимости, т. е. создаваемый объект Sound стал локальным. А удаление:

Код:

delete this.onEnterFrame;
происходит сразу после первого вхождения в кадр, чтобы дальнейшая инициация Sound не происходила, т. е. чтобы объект Sound был создани один раз.

Этот код написан, как пример, я его не использую, мне оч. хотелось бы понять, как в данном случае "завязана" область видимости.

Или я что-то не так понял?

Mnilionic 13.10.2008 19:54

во-первых в данном примере onEnterFrame вообще не нужен

я проверил ваш код - событие срабатывает без проблем

iNils 13.10.2008 19:58

У меня первый вариант срабатывает.

egrik 13.10.2008 20:05

Цитата:

Сообщение от Mnilionic (Сообщение 770128)
во-первых в данном примере onEnterFrame вообще не нужен

я проверил ваш код - событие срабатывает без проблем

Ну, может быть, тогда мне интересно узнать, почему здесь:

Код:

_root.onEnterFrame = function():Void
{
        delete this.onEnterFrame;
       
        var snd:Sound = new Sound();
        snd.onLoad = function(success:Boolean):Void
        {
                trace(success);
        }
        snd.loadSound('data/snd/bg.mp3', false);
       
        var mc:MovieClip = _root.createEmptyMovieClip("test", _root.getNextHighestDepth());
        mc.onEnterFrame = function():Void
        {
                trace(snd instanceof Sound);
        }

}

trace все-равно "говорит" о том, что snd это Sound, когда он был уже удален, да и получается, что mc.onEnterFrame также должна быть удалена, а н, нет

egrik 13.10.2008 20:12

Вложений: 1
Странно, посмотрите, плиз в аттаченном файле, может настройки какие-либо неверные или я что-то забыл. Заранее благодарен.

Mnilionic 14.10.2008 16:15

чем помочь? Ваш скрипт работает.
Какой вопрос?

egrik 14.10.2008 16:27

Цитата:

Сообщение от Mnilionic (Сообщение 770301)
чем помочь? Ваш скрипт работает.
Какой вопрос?

Странно, у меня не работает (
В общем ладно, не буду больше никого отвлекать, непонимание осталось, жаль, еще поразбираюсь. Всем большое спасибо за помощь ;)

chingachgoog 16.10.2008 12:52

Все верно - дело в области видимости (и первый вариант не работает):

Цитата:

Сообщение от egrik (Сообщение 770109)
Код:

_root.onEnterFrame = function() {
        delete this.onEnterFrame; // объект активации функции onEnterFrame удаляется, если не было создано на него ссылок
        var t = new Sound();
            // переменная t - переменная объекта активации функции onEnterFrame (т.к. стоит var), т.е. видна только из нее
        t.onLoad = function(a){
                trace(a);
        }
        t.loadSound('data/snd/bg.mp3', false);
}

Почему в этом случае не срабаывает событие onLoad?

Все дело в маленьком слове var внутри блока функции - это имеет большие последствия (см. выше комментарии). Если var убрать, то все будет работать.

Цитата:

Сообщение от egrik (Сообщение 770109)
Также удивительно то, что если мп3 файла не существует, то событие срабатывает.

Ничего удивительного. onLoad сработает (покажет false) сразу в первом кадре, т.е. еще ДО ТОГО как сработает delete this.onEnterFrame

Цитата:

Сообщение от egrik (Сообщение 770109)
Еще момент, если: будет так:

Код:

var t = new Sound();
_root.onEnterFrame = function(){
        ...
}

т. е. если переменная t будет глобальной, то тоже все будет ок.

Глобальная переменная - это совсем другое. В данном случае это то же самое, как если бы в первом примере, вы не поставили var. Т.е. указатель this для переменной t при наличии var указывает на объект активации функции onEnterFrame, а если var нет или переменная определена вне тела функции - то this указывает на соответствующую временную диаграмму (в данном случае _root)


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

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