在安卓中,調用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)