了解Android WebView JavaScript界面 [英] Understanding Android webview javascript interface
问题描述
我创建了一个Android WebView
,并使用 addJavascriptInterface(mObject,"jsinterface")
注入了 javascript
接口.直到我使用 new
运算符在JavaScript中创建一个具有相同名称(jsinterface)的对象之前,它才能正常工作.
I have created an android WebView
, and injected javascript
interface using addJavascriptInterface(mObject, "jsinterface")
. It works fine until I create an object with same name (jsinterface) in JavaScript using the new
operator.
WebView mWebView = findViewById(R.id.myWebView);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new MyWebChromeClient((Activity)mContext));
mWebView.addJavascriptInterface(new testClass(), "jsinterface");
mWebView.loadUrl("UrlToLoad");
testClass.java
public class testClass{
public testClass() {
}
@JavascriptInterface
public String testNativeMethod() {
return "Java method called!!";
}
}
我的Java脚本代码
test.js
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
来完成此操作?
Problem:
Is this possible for a javascript
object to have access to both , i.e javascript
methods and native JAVA
methods(exposed to it via javascriptinterface
) ? Is there any possibility of setting any property to webview
OR executing any JS script
to get this done?
推荐答案
尝试
您可以尝试制作另一个对象,该对象将重新转换对javascript接口的调用.在 WebViewClient
中实施 onPageStarted
方法,并在 onPageStarted
方法,如下所示.
TRY
You may try to make another object, which will retranslate calls to javascript interface.Implement onPageStarted
method in WebViewClient
, and inject javascript in onPageStarted
method, in the following way.
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);
}
});
希望这会有所帮助:-)
Hope this helps :-)
这篇关于了解Android WebView JavaScript界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!