Резюме
Я хочу, чтобы иметь возможность вызвать функцию JavaScript из приложения Flex с помощью ExternalInterface и передать ссылку на другую функцию JavaScript в качестве аргумента.Как передать ссылку на функцию JS как аргумент вызова ExternalInterface?
Base Пример
Учитывая следующий JavaScript:
function foo(callback)
{
// ... do some stuff
callback();
}
function bar()
{
// do some stuff that should happen after a call to foo
}
Я хочу позвонить foo
из моего гибкого приложения с помощью ExternalInterface и передать ссылку на bar
в качестве обратного вызова.
Почему
Действительно, foo
не моя функция (а, скорее, FB.Connect.showBookmarkDialog
), что из-за ограничений на Facebook IFrame приложений можно назвать только по нажатию кнопки. Моя кнопка, по причинам дизайна, находится в приложении 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() {}`