我在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;。
任何人都可以帮助我吗?有可能这样做吗?
非常感谢。
答案 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);
现在它有效!谢谢你的帮助。