我创建了一个android WebView
,并使用javascript
注入了addJavascriptInterface(mObject, "jsinterface")
接口。它工作正常,直到我使用new
运算符在JavaScript中创建一个具有相同名称的对象(jsinterface)。
WebView mWebView = findViewById(R.id.myWebView);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new MyWebChromeClient((Activity)mContext));
mWebView.addJavascriptInterface(new testClass(), "jsinterface");
mWebView.loadUrl("UrlToLoad");
public class testClass{
public testClass() {
}
@JavascriptInterface
public String testNativeMethod() {
return "Java method called!!";
}
}
function test(msg){
this.message = msg;
this.testJSMethod = function(){
return this.message;
}
}
alert(jsinterface.testNativeMethod()); // prints Java method called!!
jsinterface= new test("JS method called...");
alert(jsinterface.testJSMethod()); // prints JS method called...
alert(jsinterface.testNativeMethod()); // errors "NPMethod called on non- NPObject"
javascript
对象是否可以访问这两种方法,即javascript
方法和本地JAVA
方法(通过javascriptinterface
公开)?是否有可能将任何属性设置为webview
或执行任何JS script
来完成此操作?
答案 0 :(得分:5)
在javascript中考虑document
。当您在Web浏览器中时,这是一个您可以随时访问的全局对象。如果您创建自己的名为new
的{{1}} var,则访问全局document
时会遇到问题。
执行此行时:
document
您正在添加名为 mWebView.addJavascriptInterface(new testClass(), "jsinterface");
的全局对象。这与jsinterface
的情况相同。如果创建具有相同名称的var,它将覆盖现有的全局引用。
向document
添加javascript界面后,您无需创建对该界面的WebView
引用。 new
已经为您完成了这项工作。
答案 1 :(得分:3)
您可以尝试创建另一个对象,它将重新调用javascript interface.Implement onPageStarted
方法WebViewClient
中的onPageStarted
方法,并按照以下方式在 mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageStarted (WebView view, String url, Bitmap favicon){
String jsScript= "javascript:var functions_array = ['testNativeMethod'];";
jsScript+="var jsinterface = {};"
jsScript+="functions_array.map(function(id){"
jsScript+="jsinterface[id]= function() {"
jsScript+="try{return temp_obj[id].apply(temp_obj, arguments);}"
jsScript+="catch(e) { console.log('ERROR: ' + e + ', method ' + id);"
jsScript+="return false;}}})"
view.loadUrl(jsScript);
}
});
方法中注入javascript。< / p>
stringify_keys
希望这会有所帮助: - )