-
WebView简单设置准备
WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true);
-
Html调用Android本地JS
- 匿名内部类写法(其他写法就不说了)
js方法带一个参数,有了这个,无参和有多个参数的js方法就好说了
方法一定要一定要一定要添加这个注解@JavascriptInterface
注意这个方法可以让JS代码控制宿主程序,这是一个非常有力的特性,但是同时也存在一些安全问题,因为进一步JS代码可以通过反射访问到注入对象的公有域。攻击者可能会在HTML和JavaScript中包含了有威胁性的代码。
所以Android 4.1,API 17,也就是JELLY_BEAN 开始,只有被JavascriptInterface 注解标识的公有方法可以被JS代码访问。 //这一段是copy的-
参数解释
- 第一个参数是一个Object对象,这里采用匿名内部类的写法了,毕竟只是个小例子。其中定义了一个供Html的JS调用的方法functionTest();
调用方式为:(重点:javascript:DEMO.functionTest())
<a href="#" id="ttt" onclick="javascript:DEMO.functionTest()">Click Me 中文会乱码吗</a>
- 第二个参数相比已经知道了,借用一下API的解释:the name used to expose the object in JavaScript
它只是一个给JS用来标识的名字
- 第一个参数是一个Object对象,这里采用匿名内部类的写法了,毕竟只是个小例子。其中定义了一个供Html的JS调用的方法functionTest();
mWebView.addJavascriptInterface(new Object() { @JavascriptInterface public void functionTest() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:test('" + "123456" + "')"); } }); } }, "DEMO");
-
Android调用Html中的JS
其实,上面已经写过了,只有一句话:
mWebView.loadUrl("javascript:test('" + "123456" + "')");
貌似有点过于简单了呢,那就再多说点:
- test(str)是写在Html中的一个JS函数,直接上整个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这个方法
如果你没有写下面这个的话,是不会产生反应的
```java
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
return super.onJsAlert(view, url, message, result);
}
});
```
-
结束
至此,JS相互调用也就差不多了,有问题欢迎联系我。