-
WebView簡單設置準備
WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); -
Html調(diào)用Android本地JS
- 匿名內(nèi)部類寫法(其他寫法就不說了)
js方法帶一個參數(shù),有了這個,無參和有多個參數(shù)的js方法就好說了
方法一定要一定要一定要添加這個注解@JavascriptInterface
注意這個方法可以讓JS代碼控制宿主程序,這是一個非常有力的特性,但是同時也存在一些安全問題,因為進一步JS代碼可以通過反射訪問到注入對象的公有域。攻擊者可能會在HTML和JavaScript中包含了有威脅性的代碼。
所以Android 4.1,API 17,也就是JELLY_BEAN 開始,只有被JavascriptInterface 注解標識的公有方法可以被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用來標識的名字
- 第一個參數(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>
- 關于alert這個方法
如果你沒有寫下面這個的話,是不會產(chǎn)生反應的
```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)系我。