2013-10-06 69 views
0

如何在Javascript接口中將函數作爲參數傳遞,將其保存爲字符串,然後調用?如何在Javascript接口中將Javascript函數作爲參數傳遞?

例如,我描述了Javascript Interface

class JSInterface{ 
    String myFunction; 

    //set function into myFunction attribute 
    @JavascriptInterface 
    public void setMyFunction(String func) { 
    this.myFunction = func; 
    } 

    @JavascriptInterface 
    public void executeMyFunction() { 
    webView.loadUrl("javascript:"+this.myFunction); 
    } 

} 

添加:

//... 

webview..addJavascriptInterface(new JSInterface, "application"); 

//... 

JS

window.application.setMyFunction(function(){ 
     //some code here... 
}); 

注:傳遞函數JS需要在這種形式下,不是作爲一個字符串或json。

但事實上,在setMyFunction我得到"undefined",但預計"window.application.setMyFunction(function(){ //some code here...});"。請告訴我該怎麼做,我會非常感激!

回答

0

爲了解決這個問題,當函數作爲null傳遞時,我們需要聲明將函數作爲字符串發送到JS Interface

我們還需要在onPageFinished時這樣做。

例如:

@Override 
public void onPageFinished(WebView view, String url) { 
    view.loadUrl("javascript: window.APPLICATION.setMyFunction = function(func){" 
     + "window.APPLICATION.setMyFunctionAsString(func.toString());" 
     + "};"); 
    super.onPageFinished(view, url); 
} 

...和setMyFunctionAsStringJS Interface

@JavascriptInterface 
public void setMyFunctionAsString(String func) { 
    this.myFunction = func; 
} 

現在,finnaly,當我們這樣做:

window.APPLICATION.setMyFunction(function(){ 
     //some code here... 
}); 

我們將在"window.APPLICATION.setMyFunction(function(){\n//some code here...\n});"myFunction並且可以輕鬆地將其稱爲:

@JavascriptInterface 
public void executeMyFunction() { 
    webView.loadUrl("javascript:"+this.myFunction); 
} 

我希望這能幫助別人=)

0

試試這個:

Convert Javascript Object (incl. functions) to String

然後附加函數調用字符串:

function(){ 
.. 
}() 

,並在該字符串調用eval()

+0

不太明白你的意思。問題是,我無法在JavaScript端做任何事情。我只能處理傳遞給'Javasctipt Intarface'的參數。 –

+0

什麼執行JavaScript然後?如果這是在客戶端處理的,字符串中的函數應該足夠了嗎? – Robert

+0

是的,我需要設置字符串像' ''function(){ //這裏的一些代碼...' }「'到'myFunction'屬性。這將是足夠的。但我只得到''undefined''。 –

相關問題