Странности прослушивателя событий AS3 Preloader

У меня есть предварительный загрузчик, который загружает и прикрепляет swf следующим образом:

stage.addChild(loadedSWF);

В загруженном SWF у меня есть прослушиватель событий:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

Когда TextField, добавленный в список отображения, сфокусирован, onKeyDown перестает отвечать

НО

Когда загруженный SWF открывается без предварительного загрузчика, onKeyDown работает, пока фокус находится на TextField

Почему это происходит? Как это можно контролировать?

Вот прелоадер:

l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loop);
    l.contentLoaderInfo.addEventListener(Event.COMPLETE, done);
    l.load(new URLRequest("http://www.foo.com/foo.swf"));

    function loop(e:ProgressEvent):void
    {
        perc = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        lt.text = String(perc);
        if (perc >= 100)
            l.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, loop);
    }

    function done(e:Event):void
    {
        l.contentLoaderInfo.removeEventListener(Event.COMPLETE, done);
        stage.addChild(l);
    }

person RValentine    schedule 05.03.2011    source источник
comment
Не будет ли тогда проблема с предварительным загрузчиком? Вероятно, вам следует опубликовать код для этого.   -  person    schedule 06.03.2011
comment
Добавил прелоадер в вопрос   -  person RValentine    schedule 06.03.2011


Ответы (2)


поместите экземпляр вашего события клавиатуры в событие onAddedToStage.

addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

function onAddedToStage(evt:Event):void
{
    removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}

это остановит его работу в автономном swf, но он будет работать при загрузке в оболочку загрузчика.

person Ribs    schedule 05.03.2011
comment
ну какашки. это было мое предположение :) - person Ribs; 06.03.2011

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

Чтобы исправить это, добавьте следующую строку в загружаемый swf

Security.addDomain("http://www.yourdomain.com");

Я предполагаю, что эта строка уже есть в прелоадере.

Также, чтобы проверить, имеет ли swf доступ к родителю, он прикреплен в классе Loader, который вы можете использовать

l.contentLoader.childAllowsParent

person RValentine    schedule 10.03.2011