检测是否在Android WebView中单击了特定按钮

时间:2016-11-15 21:55:56

标签: javascript android webview

我目前正在开发一款Android应用。这个应用程序包含一个WebView,并显示一个我不拥有的网站。 (即网上商店)

应用程序应该识别/检测用户何时单击此网站上的特定按钮(例如“购买产品”按钮)。如果用户点击了这样一个按钮,则该应用会弹出一个Toast。

我知道每个网站都会有所不同,但是我如何对点击检测进行编程呢?我读了一些关于注入JavaScript等的文章,但是我真的不明白这是怎么回事。有没有办法说:如果用户点击id = buy_button的按钮,然后显示吐司?

感谢您的帮助!

2 个答案:

答案 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界面​​,然后再调用一个方法。有意义吗?