Как передать ссылку на функцию JS в качестве аргумента вызова ExternalInterface? - PullRequest
3 голосов
/ 26 марта 2010

Резюме
Я хочу иметь возможность вызывать функцию JavaScript из приложения Flex с использованием ExternalInterface и передавать в качестве аргумента ссылку на другую функцию JavaScript.

Базовый пример
С учетом следующего JavaScript:

function foo(callback)
{
    // ... do some stuff
    callback();
}

function bar()
{
    // do some stuff that should happen after a call to foo
}

Я хочу вызвать foo из своего приложения Flex, используя ExternalInterface, и передать ссылку на bar в качестве обратного вызова.

Почему
Действительно, foo - это не моя функция (а, скорее, FB.Connect.showBookmarkDialog), которая из-за ограничений на приложения iframe в Facebook может вызываться только нажатием кнопки. Моя кнопка по причинам дизайна находится в приложении Flex. К счастью, можно вызвать ExternalInterface.call("FB.Connect.showBookmarkDialog", callback), чтобы открыть диалоговое окно закладок. Но для FB.Connect.showBookmarkDialog требуется обратный вызов JS, поэтому, если я хочу получить обратный вызов (что я и делаю), мне нужно передать ссылку на функцию JS в качестве единственного аргумента.

Реальный пример

MXML:

<mx:Button click="showBookmarkDialog();" />

ActionScript:

function showBookmarkDialog() : void
{
    ExternalInterface.registerCallback(
        "onBookmarkDialogClosed", 
        onBookmarkDialogClosed
    );
    ExternalInterface.call(
        "FB.Connect.showBookmarkDialog", 
        /* ref to JS function onBookmarkDialogClosed ? */
    );
}

function onBookmarkDialogClosed(success:Boolean) : void
{
    // sweet, we made it back
}

JavaScript:

function onBookmarkDialogClosed()
{
    var success;
    // determine value of success
    getSWF().onBookmarkDialogClosed(success);
}

Неудачные эксперименты Я пытался ...

ExternalInterface.call(
    "FB.Connect.showBookmarkDialog", 
    "onBookmarkDialogClosed"
);

ExternalInterface.call(
    "FB.Connect.showBookmarkDialog", 
    onBookmarkDialogClosed
);

ExternalInterface.call(
    "FB.Connect.showBookmarkDialog",
    function() : void
    {
        ExternalInterface.call("onBookmarkDialogClosed");
    }
);

ExternalInterface.call(
    "FB.Connect.showBookmarkDialog",
    function()
    {
        this["onBookmarkDialogClosed"]();
    }
);

Примечание:

  1. Передача строки в качестве аргумента в вызов ExternalInterface приводит к тому, что JS FB в основном пытается выполнить "onBookmarkDialogClosed" () `, что, разумеется, не будет работать.
  2. Передача функции в качестве аргумента приводит к объекту функции на другой стороне (подтверждается с помощью `typeof`), но она кажется пустой функцией; а именно, `function Function () {}`

1 Ответ

1 голос
/ 26 марта 2010

Как всегда, нужно только задать вопрос, чтобы ответ был раскрыт ...

Решение

ExternalInterface.call("FB.Connect.showBookmarkDialog(onBookmarkDialogClosed)");
...