在安卓中,调用WebView中的js函数,在平台支持的情况下,可选使用 evaluateJavascript 或 loadUrl
本文中使用 loadUrl 方式
重写 SerializeJson 后使用即可
1 public abstract class WebViewJsHelper 2 { 3 //重写此函数,返回对象o的json字符串 4 public abstract String SerializeJson(Object o); 5 //模板如下: 6 //javascript:window["callBack"]({ a: "b" }, "b"); 7 public String getCallFunctionString(String functionName, Object... paramArr) 8 { 9 StringBuilder sb = new StringBuilder(); 10 //使用数组方式调用,可以支持非法变量名的情况,使用 evaluateJavascript方式时,只需要去掉下行中的 “javascript:” 11 sb.append("javascript:window['"); 12 //字符串用了双引号括起来,所以需要处理单引号,以支持functionName中包含单引号的情况 13 //一个反斜杠'\'用在replace和replaceAll中需要用4个反斜杠"\\\\"来表示 14 //单引号本身在java字符串及正则中均不需要转义 15 sb.append(functionName.replaceAll("'", "\\\\'")); 16 sb.append("']("); 17 boolean first = true; 18 for (Object obj : paramArr) 19 { 20 if (!first) 21 { 22 sb.append(", "); 23 } 24 String jsonStr = SerializeJson(obj); 25 //这里的jsonStr不需要处理双引号了,序列化的过程已经处理了内部字符串属性。其他属性可以直接生成对象供js调用 26 sb.append(jsonStr); 27 28 if (first) 29 { 30 first = false; 31 } 32 } 33 sb.append(")"); 34 return sb.toString(); 35 } 36 }
调用参考,C#,java版本的自行理解吧
var paramArr = new Object[] { new {//这是个复杂对象 errcode=0, message="MTIzMTIzMTIzMTIzMTIzMTIzMTIzMTIz",//字符串属性 }, "abc", 1, true }; jsHelper.GetCallFunctionString("CallBack", paramArr).Dump();
生成的文本如下:
javascript:window['CallBack']({"errcode":0,"message":"MTIzMTIzMTIzMTIzMTIzMTIzMTIzMTIz"}, "abc", 1, true)