4

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

有没有办法检测在 WebView 中调用某个 JavaScript 函数的时间?如果我可以绑定该功能并确保实际执行注销,那么我可以自己让 webview 转到登录页面。

4

2 回答 2

6

您可以使用JavascriptInterface. 以下示例来自文档。它反过来工作。您可以在 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>
于 2012-08-17T18:18:56.140 回答
0

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

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

webview.loadUrl("javascript:" +
"var functionNameOriginal = functionName;" +
"functionName = function(args) {" +
    "Android.showToast();" +
    "functionNameOriginal(args);" +
"}");
于 2013-05-20T21:24:25.433 回答