在WebView中捕获某些Javascript函数调用

时间:2012-08-17 17:47:42

标签: javascript android webview

我正在编写一个基本的网络浏览器,只能访问某个网站(由其他公司开发和维护)以进行我的工作,但是为了登录并计算在网站上花费的时间(两个非常对我公司来说重要的事情)你需要在网站上用某个按钮注销。 我查看了页面源代码,所有按钮都调用了一个javascript函数(类似于doLogoff(或类似名称)),它在普通浏览器上只关闭登录后创建的窗口。 在我的应用程序中,一切都在一个窗口中完成,没有选项卡(不需要它们),我不完全确定关闭窗口的调用对我的应用程序有什么影响,但WebView上的站点只是保持在该页面,只有在您点击链接时才会返回登录页面。

无论如何都要检测何时在WebView中调用某个JavaScript函数?如果我可以绑定该函数并确保实际执行注销,那么我可以自己将webview转到登录页面。

2 个答案:

答案 0 :(得分:5)

您可以使用JavascriptInterface执行此操作。以下示例来自documentation。它反过来工作。您可以在javascript中创建一个函数,该函数将触发您活动中的java代码。

您在java代码中声明了您的界面。

public class JavaScriptInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

您将界面添加到WebView

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

在您的网页中,您可以从脚本中调用java方法

<script type="text/javascript">
    function showAndroidToast(toast) {
    Android.showToast(toast);
    }
</script>

答案 1 :(得分:0)

首先,创建由NathanZ规定的JavascriptInterface。

然后覆盖要挂钩的函数,如下所示:

webview.loadUrl("javascript:" +
"var functionNameOriginal = functionName;" +
"functionName = function(args) {" +
    "Android.showToast();" +
    "functionNameOriginal(args);" +
"}");