2016-11-15 70 views
2

我目前正在开发一个Android应用程序。这个应用程序包含一个WebView并显示一个我不拥有的网站。 (f.e.一个网上商店)检测Android WebView中是否点击了特定的按钮

应用程序应该识别/检测当用户点击本网站上的特定按钮(f.e“购买产品”按钮)。如果用户点击这样一个按钮,那么应用程序会弹出一个敬酒。

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

感谢您的帮助!

回答

1

让我给你提供一个完整的例子。 为了您的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(“AddProductToCart”)

信息:\ n和该clickListener方法内部串的怪异组合这样设置,因为IDE的。 (“;”在字符串内部导致问题)。

+0

感谢您的回答。但它似乎没有工作。我实现它的方式如下:webView.addJavascriptInterface(新的对象(){ 公共 无效performClick(){ Toast.makeText(getApplicationContext(), “结帐!”,Toast.LENGTH_LONG).show();} },“myBoundJavascriptMethod”); –

+0

此外,我启用了JavaScript,并相应地设置了整个视图。我将元素ID更改为buyingtools-add-to-cart-button。顺便说一句,我把http://store.nike.com/ch/de_de/pd/mercurial-superfly-v-tech-craft-2-herren-fussballschuh-fur-normalen-rasen/pid-11229711/pgid-11626158例如试一试。 –

+0

哦,这是我得到的错误:I /铬:[INFO:CONSOLE(1)]“未捕获TypeError:无法读取null的属性'addEventListener',来源: –

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接口,然后调用他们的方法。合理?

+0

感谢您的回答,但wblaschko已经帮助我。 :) –