我目前正在开发一款Android应用。这个应用程序包含一个WebView,并显示一个我不拥有的网站。 (即网上商店)
应用程序应该识别/检测用户何时单击此网站上的特定按钮(例如“购买产品”按钮)。如果用户点击了这样一个按钮,则该应用会弹出一个Toast。
我知道每个网站都会有所不同,但是我如何对点击检测进行编程呢?我读了一些关于注入JavaScript等的文章,但是我真的不明白这是怎么回事。有没有办法说:如果用户点击id = buy_button的按钮,然后显示吐司?
感谢您的帮助!
答案 0 :(得分:2)
让我举一个完整的例子。 对于您的http://store.nike.com/ch/de_de/pd/mercurial-superfly-v-tech-craft-2-herren-fussballschuh-fur-normalen-rasen/pid-11229711/pgid-11626158
特定网站{
...
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.addJavascriptInterface(new MyJavaScriptInterface(this), "ButtonRecognizer");
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
loadEvent(clickListener());
}
private void loadEvent(String javascript){
webview.loadUrl("javascript:"+javascript);
}
private String clickListener(){
return getButtons()+ "for(var i = 0; i < buttons.length; i++){\n" +
"\tbuttons[i].onclick = function(){ console.log('click worked.'); ButtonRecognizer.boundMethod('button clicked'); };\n" +
"}";
}
private String getButtons(){
return "var buttons = document.getElementsByClassName('add-to-cart'); console.log(buttons.length + ' buttons');\n";
}
});
webview.loadUrl("http://store.nike.com/ch/de_de/pd/mercurial-superfly-v-tech-cra\u200C\u200Bft-2-herren-fussballschuh-fur-normalen-rasen/pid-11229711/pgid-11626158");
...
}
class MyJavaScriptInterface {
private Context ctx;
MyJavaScriptInterface(Context ctx) {
this.ctx = ctx;
}
@JavascriptInterface
public void boundMethod(String html) {
new AlertDialog.Builder(ctx).setTitle("HTML").setMessage("It worked")
.setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show();
}
}
将按钮的onClick更改为您需要的内容。
对于其他所有人来说,看起来像getElementById()的页面特定问题或Android问题,但按类获取元素(getElementsByClassName())按预期工作。 此外,可能需要用getElementsByName()替换getElementsByClassName(),例如在此网站上:https://www.digitec.ch/de/s1/product/lexon-flip-wecker-3522142。 你应该把getElementsByName放在哪里(&#39; AddProductToCart&#39;)
信息:由于IDE,clickListener方法中的\ n和奇怪的字符串组合都是这样设置的。 (&#34;;&#34;在字符串中引起问题)。
答案 1 :(得分:2)
webview.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:document.getElementById('buy_button').onclick = function(){alert('my message');}");
}
});
这告诉您的webview,当它完成加载时,它需要执行您的自定义JavaScript代码。在这种情况下,js代码在页面中搜索id为“buy button”的元素,并设置onclick处理程序以提醒您的消息。
如果你特别需要吐司,那么你需要设置一个javascript界面,然后再调用一个方法。有意义吗?