Резюме
Я хочу иметь возможность вызывать функцию 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"]();
}
);
Примечание:
- Передача строки в качестве аргумента в вызов ExternalInterface приводит к тому, что JS FB в основном пытается выполнить "onBookmarkDialogClosed" () `, что, разумеется, не будет работать.
- Передача функции в качестве аргумента приводит к объекту функции на другой стороне (подтверждается с помощью `typeof`), но она кажется пустой функцией; а именно, `function Function () {}`