2016-11-15 108 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已經幫助我。 :) –