使用Android Webview覆盖当前的Javascript函数

时间:2013-11-18 13:23:59

标签: javascript android interface webview

我将我的网站移植到Android,并使用Webview向用户显示内容。我的网站上有很多Javascript函数,我想拦截它们。我已经看过a "solution" here

但是,我认为应该采用更合适的方式,使用Javascript接口:

this.webView.addJavascriptInterface(this.webJavascriptInterface, "Android");

这样,我必须修改我的网站才能同时调用myFunction()Android.myFunction()。我试图在界面中留下一个空白的字符串:

this.webView.addJavascriptInterface(this.webJavascriptInterface, "");

但结果是我猜,它无法正常工作。有没有办法在Webview中覆盖当前的Javascript函数?

2 个答案:

答案 0 :(得分:2)

// android
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        webView.loadUrl("javascript:function inputClick(val){native.abcd(val);}");     // override js function
    }
});

webView.loadUrl("file:///android_asset/test.html");

webView.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public void abcd(int val) {
        Log.e(TAG, "#js abcd" + val);
    }
}, "native");

<!-- html -->
<input type="button" onclick="inputClick(2)" value="button">

==在2015年9月7日添加一些解释

因为javascript功能可以覆盖,所以您可以在页面完成时覆盖javascript功能

如果没有,正常的工具可能是这样的:

// js code
function inputClick(val) {
    native.abcd(val); // native and abcd defined in WebView method addJavascriptInterface
}

但是这个普通的工具似乎在iOS(Object-C)中不起作用,并且必须编辑HTML页面。 只是将java-javascript桥代码从HTML移动到Java。 (请参阅示例代码中的方法 onPageFinished

答案 1 :(得分:0)

您可以通过注入重新定义旧功能的新javascript来做到这一点,基本上,您可以使用此功能覆盖现有功能。

例如,要覆盖window.print()功能,我可以使用此

webView.loadUrl("javascript:window.print = function() {Android.printPage();}")