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:
- 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() {}`