-
WebView簡單設(shè)置準(zhǔn)備
WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true);
-
Html調(diào)用Android本地JS
- 匿名內(nèi)部類寫法(其他寫法就不說了)
js方法帶一個參數(shù)挣输,有了這個吼畏,無參和有多個參數(shù)的js方法就好說了
方法一定要一定要一定要添加這個注解@JavascriptInterface
注意這個方法可以讓JS代碼控制宿主程序,這是一個非常有力的特性请琳,但是同時也存在一些安全問題韵卤,因為進(jìn)一步JS代碼可以通過反射訪問到注入對象的公有域袒炉。攻擊者可能會在HTML和JavaScript中包含了有威脅性的代碼氧腰。
所以Android 4.1交掏,API 17妆偏,也就是JELLY_BEAN 開始,只有被JavascriptInterface 注解標(biāo)識的公有方法可以被JS代碼訪問盅弛。 //這一段是copy的-
參數(shù)解釋
- 第一個參數(shù)是一個Object對象钱骂,這里采用匿名內(nèi)部類的寫法了,畢竟只是個小例子挪鹏。其中定義了一個供Html的JS調(diào)用的方法functionTest()见秽;
調(diào)用方式為:(重點:javascript:DEMO.functionTest())
<a href="#" id="ttt" onclick="javascript:DEMO.functionTest()">Click Me 中文會亂碼嗎</a>
- 第二個參數(shù)相比已經(jīng)知道了,借用一下API的解釋:the name used to expose the object in JavaScript
它只是一個給JS用來標(biāo)識的名字
- 第一個參數(shù)是一個Object對象钱骂,這里采用匿名內(nèi)部類的寫法了,畢竟只是個小例子挪鹏。其中定義了一個供Html的JS調(diào)用的方法functionTest()见秽;
mWebView.addJavascriptInterface(new Object() { @JavascriptInterface public void functionTest() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:test('" + "123456" + "')"); } }); } }, "DEMO");
-
Android調(diào)用Html中的JS
其實讨盒,上面已經(jīng)寫過了解取,只有一句話:
mWebView.loadUrl("javascript:test('" + "123456" + "')");
貌似有點過于簡單了呢,那就再多說點:
- test(str)是寫在Html中的一個JS函數(shù)催植,直接上整個Html代碼吧肮蛹,瞧
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
function test(str) {
document.getElementById("ttt").innerHTML = str;
alert("1");
}
</script>
</head>
<body>
<div>
<a href="#" id="ttt" onclick="javascript:DEMO.functionTest()">Click Me 中文會亂碼嗎</a>
</div>
</body>
</html>
- 關(guān)于alert這個方法
如果你沒有寫下面這個的話勺择,是不會產(chǎn)生反應(yīng)的
```java
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
return super.onJsAlert(view, url, message, result);
}
});
```
-
結(jié)束
至此创南,JS相互調(diào)用也就差不多了,有問題歡迎聯(lián)系我省核。