2013-10-06 96 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''。 –

相关问题