2011-05-23 58 views
1

比方说,我们有许多ExternalInterface.addCallback功能,像这样:从ExternalInterface.addCallback查找方法名

ExternalInterface.addCallback('foo', handler); 
ExternalInterface.addCallback('bar', handler); 
ExternalInterface.addCallback('foobar', handler); 

在功能handler我想找到通过外部接口调用的方法名如foo, bar or foobar;有没有办法?例如:

private function handler(...args):void 
{ 
    arguments.callee.arguments[ 0 ]; 
} 

但我怀疑这会工作

回答

1

这应该工作。只需传递一个参数来标识你的函数,例如一个字符串。因此,当您在JavaScript代码中调用flash函数时,传递一个字符串,然后在处理函数中解析该字符串。例如:

动作:

ExternalInterface.addCallback('foo', handler); 

private function handler(s:String):void 
{ 
    if(s == "foo") { 
     //foo specific code 
    } 
} 

的javascript:

document.getElementById('flashObj').foo("foo"); 
+0

嗯,不是很,你看ExternalInterface.addCallback的第一个参数是你从JS调用的方法名称的字符串,这样的ExternalInterface .addCallback('foo',handler);将允许JS调用一个名为foo()的函数,这将由Flash中的handler()处理。 – 2011-05-23 16:30:14

+0

其次,它不是一个好主意,允许字符串传递到一个函数,这会让你的应用容易被黑客攻击,并且可能XSS – 2011-05-23 16:31:25

+0

你是对的,它被混淆在某处..而对于黑客来说,我只是指出,这是一个可能的方式来解决这个特定的问题......但无论如何,你是对的...... – ThomasM 2011-05-23 16:59:09

1

不正是你所要求的是什么,但它会给你你需要的信息。
只需创建第一个发送函数名称的参数,或者在此例中使用funcname属性创建对象,以便测试它是否存在。

的JavaScript

function thisMovie(movieName) { 
    if (navigator.appName.indexOf("Microsoft") != -1) { 
     return window[movieName]; 
    } else { 
     return document[movieName]; 
    } 
} 
    thisMovie("ExternalInterfaceExample").genericCallBack({ funcname:'foo' }) 
    thisMovie("ExternalInterfaceExample").genericCallBack({ funcname:'poo' }) 
    thisMovie("ExternalInterfaceExample").genericCallBack({ funcname:'moo' }) 

AS3

public function foo():void{ 
    trace('in foo') 
} 

public function poo():void{ 
    trace('in poo') 
} 

public function moo():void{ 
    trace('in moo') 
} 
public function genericCallBack(o:Object):void{ 
    trace('calling '+o.funcname) 
    this[o.funcname]() 
} 


// add this somewhere in your init process 
ExternalInterface.addCallback('genericCallBack', genericCallBack); 
+0

这又是一个非常容易受到XSS攻击的问题,基本上你会让某人免费统治你的应用程序,因为Flash可以做跨站点脚本,这是非常危险的。不错,尽管。 – 2011-05-23 18:42:56

+0

JS中的任何函数调用都非常容易受到攻击。 SWF可以被反编译/ JS可以被注入。如果安全性是主要因素,那么您需要验证服务器端的操作。你必须确定你需要多少层安全 – 2011-05-23 19:03:06

+0

虽然,你从来没有提到你的问题的安全性,所以我真的不知道你现在要求什么。 – 2011-05-23 19:07:43