2010-03-26 3 views
3

Резюме
Я хочу, чтобы иметь возможность вызвать функцию 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"](); 
    } 
); 

отметить:

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

ответ

1

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

Решение

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