2

如何在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...});"。请告诉我该怎么做,我将不胜感激!

4

2 回答 2

0

试试这个:

将 Javascript 对象(包括函数)转换为字符串

然后将函数调用附加到字符串:

function(){
..
}()

并调用eval()该字符串。

于 2013-10-06T19:49:03.360 回答
0

为了解决这个问题,当函数传递为null时,我们需要将js函数传入的函数声明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;
}

现在,最后,当我们这样做时:

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);
}

我希望这会对某人有所帮助=)

于 2013-10-15T08:05:02.143 回答