了解Android webview javascript界面

时间:2016-04-26 12:21:48

标签: javascript java android webview

我创建了一个android WebView,并使用javascript注入了addJavascriptInterface(mObject, "jsinterface")接口。它工作正常,直到我使用new运算符在JavaScript中创建一个具有相同名称的对象(jsinterface)。

我的Java代码:

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来完成此操作?

2 个答案:

答案 0 :(得分:5)

在javascript中考虑document。当您在Web浏览器中时,这是一个您可以随时访问的全局对象。如果您创建自己的名为new的{​​{1}} var,则访问全局document时会遇到问题。

执行此行时:

document

您正在添加名为 mWebView.addJavascriptInterface(new testClass(), "jsinterface"); 的全局对象。这与jsinterface的情况相同。如果创建具有相同名称的var,它将覆盖现有的全局引用。

document添加javascript界面​​后,您无需创建对该界面的WebView引用。 new已经为您完成了这项工作。

答案 1 :(得分:3)

TRY

您可以尝试创建另一个对象,它将重新调用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

希望这会有所帮助: - )