如何将 JS 函数的引用作为参数传递给 ExternalInterface 调用?

Posted

技术标签:

【中文标题】如何将 JS 函数的引用作为参数传递给 ExternalInterface 调用?【英文标题】:How to pass a reference to a JS function as an argument to an ExternalInterface call? 【发布时间】:2011-01-31 23:52:48 【问题描述】:

总结 我希望能够使用 ExternalInterface 从 Flex 应用程序调用 javascript 函数,并将对不同 JavaScript 函数的引用作为参数传递。

基本示例 给定以下 JavaScript:

function foo(callback)

    // ... do some stuff
    callback();


function bar()

    // do some stuff that should happen after a call to foo

我想使用 ExternalInterface 从我的 flex 应用程序中调用 foo,并将对 bar 的引用作为回调传递。

为什么 真的,foo 不是我的功能(而是FB.Connect.showBookmarkDialog),由于 Facebook iframe 应用程序的限制,只能通过单击按钮调用。出于设计原因,我的按钮位于 Flex 应用程序中。幸运的是,可以调用ExternalInterface.call("FB.Connect.showBookmarkDialog", callback) 来显示书签对话框。但是,FB.Connect.showBookmarkDialog 需要一个 JS 回调,所以,如果我想接收一个回调(我会这样做),我需要将一个对 JS 函数的引用作为单个参数传递。

真实例子

MXML:

<mx:Button click="showBookmarkDialog();" />

动作脚本:

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 调用会导致 FB 的 JS 基本上尝试执行 `"onBookmarkDialogClosed"()`,这不用说是行不通的。 将函数作为参数传递会在另一端产生一个函数对象(可通过 `typeof` 确认),但它似乎是一个空函数;即`function Function() `

【问题讨论】:

【参考方案1】:

与往常一样,人们只需要问一个问题就能得到答案......

解决方案

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

【讨论】:

以上是关于如何将 JS 函数的引用作为参数传递给 ExternalInterface 调用?的主要内容,如果未能解决你的问题,请参考以下文章

将引用作为命名参数传递给可变参数函数的问题

如何将数组的值作为第二个参数传递给 awk 的 split 函数?

如何将参数传递给 React js 中的函数?

我可以将类引用作为参数传递给 VB Net 中的函数吗?

如何将引用函数传递给另一个函数

C++ 将列表作为参数传递给函数