Как вызвать метод ActionScript из объекта JavaScript (HTMLLoader) в AIR? - PullRequest
3 голосов
/ 15 января 2009

Итак, у меня есть объект Application Sandbox HTMLLoader, который я создаю в AIR и просто хочу вызвать ActionScript методы из JavaScript . Во Flash это достигается с помощью нашей надежной функции ExternalInterface.addCallback () . Однако в AIR все немного по-другому, и я просто не могу заставить его работать.

Вот упрощенный обзор моего проекта:

My AIR (ActionScript) main:

public class Main extends Sprite {

    public var _as3Var:String = "testing";
    public function as3Function():void
    {
        trace("as3Function called from Javascript");
    }

    public function Main() {
        NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);
    }

    protected function onInvoke(e:InvokeEvent):void {
        NativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke );
        var app = new App();
        addChild(app);
        app.init(new ExternalContainer(), e.currentDirectory, e.arguments);
    }
}

И вот как я создаю свой объект HTMLLoader:

{
    _html = new HTMLLoader();
    _html.useCache = false;
    _html.runtimeApplicationDomain = ApplicationDomain.currentDomain;
    _html.load(new URLRequest("sandbox/AirRoot.html"));
    _html.width = 800;
    _html.height = 600;
    App.ref.addChild(_html);
}

И наконец, вот мой фрагмент JavaScript в моем файле AirRoot.html , который пытается вызвать открытый метод as3Function () , объявленный в моем главном классе:

Exposed.testAs3 = function()
{
    air.trace("Exposed.testAs3 called");            /* This works fine. */
    air.trace("runtimeVersion:");                   /* This works fine. */
    air.trace(air.NativeApplication.nativeApplication.runtimeVersion);  /* This works fine. */
    air.trace("seeing if I can get to AS3 params...");  /* This works fine. */

    /* This doesn't work - get the following error: TypeError: Value undefined does not allow function calls. */
    air.NativeApplication.nativeApplication.as3Function();
}

Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 16 января 2009

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

В любом случае, ответ:

Объект AIR HTMLLoader содержит магическое свойство HTMLLoader.window, которое является прокси для оконного объекта JavaScript. Таким образом, установка HTMLLoader.window = AS3Function; является односторонней - или в отношении моего ранее включенного примера (при условии, что я установил статическое свойство с именем Main, которое указывает на класс Main):

_html.window.as3Function = Main.as3Function;

А теперь в JavaScript я могу просто позвонить as3Function как:

<script>
    window.as3Function();
</script>

Другим интересным свойством является объект JavaScript «window.htmlLoader». Это прокси для родительского объекта AS3 HTMLLoader, в моем случае - объекта _html. Из этого вы можете получить доступ к вещам относительно объекта _html из JavaScript.

1 голос
/ 29 октября 2010

Я не уверен, что это изменение в новой версии AIR, но вам больше не нужно ссылаться на окно в вызове javascript, вы можете просто сделать это:

<script>
  as3Function();
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...