1. 程式人生 > >Android端使用WebView注入一段js程式碼實現js呼叫android

Android端使用WebView注入一段js程式碼實現js呼叫android

需求:為網頁上個連結增加點選事件,但是這個連結無法增加js程式碼

url:http://public.rongcloud.cn/view/D4F444BE2D94D760329F3CF38B4AE35C

網頁截圖:

需要給“投融資訊“四個字設定點選事件

但是觀察原始碼

<body>
<div class="wrap content">
<div class="content-inner">
<div class="content-header">
<h2 class="content-header-title">發貨房間很乾淨或</h2>
<div class="content-header-info">
<span>2017-01-08</span>
<span class="userId">投融資訊</a></span>
</div>
</div>
<div class="content-body" >
<p style="text-align: center;margin:10px 0;">
</p>
<p style="margin-top:20px;" >
<a onclick
="count('http://public.rongcloud.cn/view/11C329D37EFD51832EF7E3CF2A0CE2D4', 'D4F444BE2D94D760329F3CF38B4AE35C')"style="color:#607fa6;text-decoration:none;"href="javascript:void(0)" >
閱讀原文</a>
</p>
</div>
<div class="divider" style="height: 1px;margin: 9px 0;overflow: hidden;background-color: #e5e5e5;margin-top: 18px;
">
</div>
</div>

並沒有具體的onclick事件,怎麼辦呢?

1、首先在Chrome上寫了端測試程式碼,測試沒問題

 <script type="text/javascript">
     var child=document.getElementsByTagName('a')[0];
     child.onclick=function(){
         userIdClick();
     };
     function userIdClick(){ 
       myObj.getClose();


     };
</script>

2、然後使用安卓端注入進來

webview.getSettings().setJavaScriptEnabled(true);  
webview.addJavascriptInterface(new JSObject(), "myObj");

webview.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Toast.makeText(MainActivity.this, "wodo-7-", Toast.LENGTH_SHORT).show();
view.loadUrl(url);
return true;
}


@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);

String  js = "var script = document.createElement('script');";
js+= "script.type = 'text/javascript';";
   js+="var child=document.getElementsByTagName('a')[0];";
   js+="child.onclick=function(){userIdClick();};";
   js+= "function userIdClick(){myObj.getClose();};";

webview.loadUrl("javascript:" + js);
}
});

class JSObject {
@JavascriptInterface
// sdk17版本以上加上註解
public String getData(String txt) {
return "12345678";
}


@JavascriptInterface
// sdk17版本以上加上註解
public void getClose() {
Toast.makeText(MainActivity.this, "dododo", Toast.LENGTH_SHORT)
.show();
// finish();


}
}

這樣就可以實現點選呼叫本地方法了。

二、如果想獲取html中某個內容



@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);

String  js = "var script = document.createElement('script');";
js+= "script.type = 'text/javascript';";
   js+="var child=document.getElementsByTagName('a')[0];";
   js+="child.onclick=function(){userIdClick();};";
   js+= "function userIdClick(){myObj.getClose();};";

webview.loadUrl("javascript:" + js);
//view.loadUrl("javascript:window.myObj.showSource(document.getElementsByTagName('p')[1].innerHTML);"); 
view.loadUrl("javascript:myObj.showSource(document.getElementsByTagName('p')[0].innerHTML);");   //關鍵程式碼


}
});

/**
* 本地化JS物件(第一種方法)

* @author jiangwei1-g
*/
class JSObject {
@JavascriptInterface
// sdk17版本以上加上註解
public String getData(String txt) {
return "12345678";
}


@JavascriptInterface
// sdk17版本以上加上註解
public void getClose() {
Toast.makeText(MainActivity.this, "dododo", Toast.LENGTH_SHORT).show();


}

@JavascriptInterface
// sdk17版本以上加上註解
public void showSource(String html) { //關鍵程式碼
Toast.makeText(MainActivity.this, html, Toast.LENGTH_SHORT).show();
            System.out.println("====>html="+html); 
        } 

}