2011-05-23 54 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