我将我的网站移植到Android,并使用Webview向用户显示内容。我的网站上有很多Javascript函数,我想拦截它们。我已经看过a "solution" here。
但是,我认为应该采用更合适的方式,使用Javascript接口:
this.webView.addJavascriptInterface(this.webJavascriptInterface, "Android");
这样,我必须修改我的网站才能同时调用myFunction()
和Android.myFunction()
。我试图在界面中留下一个空白的字符串:
this.webView.addJavascriptInterface(this.webJavascriptInterface, "");
但结果是我猜,它无法正常工作。有没有办法在Webview中覆盖当前的Javascript函数?
答案 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();}")