【问题标题】:How to pass a Javascript function as an argument in Javascript Interface?如何在 Javascript 接口中将 Javascript 函数作为参数传递?
【发布时间】:2013-10-06 19:28:39
【问题描述】:

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

【问题讨论】:

    标签: java javascript android android-jsinterface


    【解决方案1】:

    试试这个:

    Convert Javascript Object (incl. functions) to String

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

    function(){
    ..
    }()
    

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

    【讨论】:

    • 不太明白你的意思。问题是我无法在Javascript side 上做任何事情。我只能处理传递给Javasctipt Intarface的参数。
    • 那么执行 javascript 是什么?如果这是在客户端处理,字符串中的函数应该足够了吗?
    • 是的,我需要将"function(){ //some code here... }" 之类的字符串设置为myFunction 属性。就足够了。但我只得到"undefined"
    • 是的,我读过,但是,正如我所说,我不能在 Javascript 端做任何事情,只能在 Java 端。
    • 客户端的东西需要执行我想的语句,反正如果你想要自调用函数,在最后添加'()'。
    【解决方案2】:

    为了解决这个问题,当函数传递为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...
    });
    

    我们将在myFunction 中添加"window.APPLICATION.setMyFunction(function(){\n//some code here...\n});",并且可以轻松地将其称为:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多