如何在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 :(得分: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);
}
我希望这会帮助某人=)