如何在Javascript接口中传递Javascript函数作为参数?

时间:2013-10-06 19:28:39

标签: java javascript android android-jsinterface

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

2 个答案:

答案 0 :(得分:0)

试试这个:

Convert Javascript Object (incl. functions) to String

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

function(){
..
}()

并在该字符串上调用eval()

答案 1 :(得分: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);
}

...以及setMyFunctionAsString中的JS 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);
}

我希望这会帮助某人=)