Android webview:为复选框的onclick事件注入一个函数调用

时间:2015-01-21 08:03:09

标签: javascript android checkbox webview

我在webview中加载了以下html代码:

<form>
    <input checked="true" id="myCheckBox" onchange=
    "location.href='/doSomething.html'" type=
    "checkbox">My Checkbox description
</form>

我无法修改此html代码,因为我不是网站的所有者。我想要做的是在我的Android应用中接收用户点击复选框和复选框的值(已选中或未选中)。

我也需要操纵复选框的状态,但这很容易。

我使用以下代码:

    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JsObject(), "injection");

    webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            webView.loadUrl(
                    "javascript:(function() { " +
                            "var ch=document.getElementById('myCheckBox');" +
                            "ch.checked=false; " + //This works!!!
                            "injection.reportCheckboxState('111111');" + //This works too
                            "function myFunction() {" +
                            "  injection.reportCheckboxState('222222'); " +
                            "}"+
                            "ch.onClick=myFunction;"+
                            //"ch.addEventListener(\"onClick\", myFunction);"+
                            "})()"
            );
        }


    @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            boolean returnVal = false;
            if (url.equalsIgnoreCase("/doSomething.htm")) {
                //I can intercept the onClick event on this checkbox, but I don't know how to read the value of the checkbox here


            } else {
                returnVal = true;
            }
            return returnVal;
        }
    });


    private class JsObject {
    @JavascriptInterface
    public void reportCheckboxState(String string) {
        Log.d(TAG, "" + string);
    }
}

我尝试做的是将一些Javascript注入此HTML表单。代码的第一行是正确的:

"var ch=document.getElementById('myCheckBox');" +
                            "ch.checked=false; " +
                            "injection.reportCheckboxState('111111');"

我在我的android日志控制台中收到字符串&#34; 111111&#34;。 ch.cheched = false也有效。

但是我无法指示它应该在&#34; onClick&#34;上调用inject.reportCheckboxState方法的复选框。事件(当用户触摸复选框时)&#34;。

任何人都可以帮助我吗?有可能这样做吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我建议你让WebView报告安卓日志中的javascript控制台消息(至少在调试版本中),这样你就可以轻松查看页面上的任何错误或警告(你可以也可以在较新版本的android上使用chrome中的检查器。

要将javascript日志添加到您的Android日志中,您必须覆盖onConsoleMessage WebViews中的WebChromeClient,这样做(API级别7 +):

webView.setWebChromeClient(new WebChromeClient() {
  @Override
  public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
    Log.d(TAG, "" + consoleMessage.message());
    return super.onConsoleMessage(consoleMessage);
  }
});

通过查看代码段中的JavaScript代码,我看不到任何错误(但我可能在那里错了,呵呵),但JavaScript日志很可能会告诉您它的内容是什么。


编辑。

再次查看您的JS代码后,您的onClick方法似乎拼写错误,应为onclick(小写)。
仍然,记录建议仍然适用!

答案 1 :(得分:0)

我用另一个方法解决了这个问题。所有建议都没有用

不幸的是,我不是网站的所有者,而且我没有权限更改原始网页。

现在,我用asynctask下载html,之后我改变了&#34; onchange&#34;复选框的事件:

//Replace the onchange from the checkbox with our method
String html=downloadthehtmlwithanasynctask
    html = html.replace("location.href='/doSomething.html'", "injection.reportCheckboxState(this.checked)");

我将这个html加载到webview中并注入我的javascript界面​​:

    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JsObject(), "injection");
(...)
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);

现在它有效!谢谢你的帮助。