2010-03-26 4 views
3

Résumé
Je souhaite être en mesure d'appeler une fonction JavaScript à partir d'une application Flex à l'aide de ExternalInterface et transmettre une référence à une autre fonction JavaScript en tant qu'argument.Comment faire passer une référence à une fonction JS en tant qu'argument d'un appel ExternalInterface?

base Exemple
Compte tenu du JavaScript suivant:

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

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

Je veux appeler foo de mon application flex avec ExternalInterface et passer une référence à bar comme le rappel.

Pourquoi
Vraiment, foo n'est pas ma fonction (mais, plutôt, FB.Connect.showBookmarkDialog) qui, en raison de restrictions sur Facebook des applications iFrame ne peut être appelé sur un bouton clic. Mon bouton, pour des raisons de conception, se trouve dans l'application Flex. Heureusement, il est possible d'appeler le ExternalInterface.call("FB.Connect.showBookmarkDialog", callback) pour afficher la boîte de dialogue du signet. Mais, FB.Connect.showBookmarkDialog nécessite un rappel JS donc, si je veux recevoir un rappel (ce que je fais), je dois passer une référence à une fonction JS comme argument unique.

réel Exemple

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); 
} 

Failed Les expériences J'ai essayé ...

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"](); 
    } 
); 

à noter:

  1. Passing une chaîne comme argument à un résultat d'appel ExternalInterface dans les JS de FB essayant essentiellement de faire `" onBookmarkDialogClosed "()` qui, inutile de le dire, ne fonctionnera pas. Passer une fonction comme argument produit un objet fonction de l'autre côté (confirmable avec `typeof`), mais il semble être une fonction vide; à savoir, `fonction function() {}`

Répondre

1

Comme toujours, il suffit de poser une question à la réponse à être révélé ...

Solution

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