|
@ -1,377 +0,0 @@
|
1
|
|
/**
|
2
|
|
* 与客户端交互的基础API
|
3
|
|
*/
|
4
|
|
window.Mobile = window.WadeMobile = (function() {
|
5
|
|
//终端类型,a为android,i为ios
|
6
|
|
var deviceType = (function(){
|
7
|
|
var sUserAgent = navigator.userAgent.toLowerCase();
|
8
|
|
var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
|
9
|
|
var bIsIphone = sUserAgent.match(/iphone os/i) == "iphone os";
|
10
|
|
var bIsAndroid = sUserAgent.match(/android/i) == "android";
|
11
|
|
var bIsWinphone = sUserAgent.match(/windows phone /i) == "windows phone " || sUserAgent.match(/windows phone os /i) == "windows phone os ";
|
12
|
|
if(bIsAndroid){
|
13
|
|
return "a";
|
14
|
|
}else if(bIsIpad||bIsIphone){
|
15
|
|
return "i";
|
16
|
|
}else{
|
17
|
|
return null;
|
18
|
|
}
|
19
|
|
})();
|
20
|
|
if(!window["TerminalType"]){
|
21
|
|
window["TerminalType"] = deviceType;
|
22
|
|
}
|
23
|
|
var terminalType = window["TerminalType"];
|
24
|
|
WadeMobile = (function(){
|
25
|
|
return{
|
26
|
|
isAndroid:function(){
|
27
|
|
return terminalType=='a';
|
28
|
|
},isIOS:function(){
|
29
|
|
return terminalType=='i';
|
30
|
|
},isWP:function(){
|
31
|
|
return terminalType=='w';
|
32
|
|
},isApp:function(){//判断是否是APP应用
|
33
|
|
return terminalType!=null;
|
34
|
|
},getSysInfo:function(callback,key,err){//TELNUMBER|IMEI|IMSI|SDKVERSION|OSVERSION|PLATFORM|SIMNUMBER
|
35
|
|
WadeMobile.callback.storageCallback("getSysInfo",callback);
|
36
|
|
execute("getSysInfo", [key],err);
|
37
|
|
},close:function(confirm,err){
|
38
|
|
if(typeof(confirm)!="boolean"){
|
39
|
|
confirm = true;
|
40
|
|
}
|
41
|
|
execute("close", [confirm],err);
|
42
|
|
},httpRequest:function(callback,requestUrl,encode,conTimeout,readTimeout,err){
|
43
|
|
if(terminalType=="i"){
|
44
|
|
requestUrl = encodeURIComponent(requestUrl);
|
45
|
|
}
|
46
|
|
WadeMobile.callback.storageCallback("httpRequest",callback);
|
47
|
|
execute("httpRequest", [requestUrl,encode,conTimeout,readTimeout],err);
|
48
|
|
},dataRequest:function(callback,dataAction,param,encode,conTimeout,readTimeout,err){
|
49
|
|
WadeMobile.callback.storageCallback("dataRequest",callback);
|
50
|
|
execute("dataRequest", [dataAction,param,encode,conTimeout,readTimeout],err);
|
51
|
|
},openUrl:function(url,err){
|
52
|
|
execute("openUrl", [encodeURIComponent(url)],err);
|
53
|
|
},openPage:function(action,data,err){
|
54
|
|
execute("openPage", [action,data],err);
|
55
|
|
},openTemplate:function(action,context,err){
|
56
|
|
execute("openTemplate", [action,context],err);
|
57
|
|
},back:function(err){
|
58
|
|
execute("back", [],err);
|
59
|
|
},getPage:function(callback,action,param,err){
|
60
|
|
WadeMobile.callback.storageCallback("getPage",callback);
|
61
|
|
execute("getPage", [action,param],err);
|
62
|
|
},getTemplate:function(callback,action,context,err){
|
63
|
|
WadeMobile.callback.storageCallback("getTemplate",callback);
|
64
|
|
execute("getTemplate", [action,context],err);
|
65
|
|
},storageDataByThread:function(dataAction,param,waitoutTime,err){
|
66
|
|
execute("storageDataByThread", [dataAction,param,waitoutTime],err);
|
67
|
|
},openDialog:function(callback,pageAction,param,width,height,err){
|
68
|
|
WadeMobile.callback.storageCallback("openDialog",callback);
|
69
|
|
execute("openDialog", [pageAction,param,width,height],err);
|
70
|
|
},closeDialog:function(result,state,err){
|
71
|
|
execute("closeDialog", [result,state],err);
|
72
|
|
},openWindow:function(callback,pageAction,param,err){
|
73
|
|
WadeMobile.callback.storageCallback("openWindow",callback);
|
74
|
|
execute("openWindow", [pageAction,param],err);
|
75
|
|
},closeWindow:function(result,state,err){
|
76
|
|
execute("closeWindow", [result,state],err);
|
77
|
|
},openSlidingMenu:function(callback,action,param,width,height,leftMargin,topMargin,err){
|
78
|
|
WadeMobile.callback.storageCallback("openSlidingMenu",callback);
|
79
|
|
execute("openSlidingMenu", [action,param,width,height,leftMargin,topMargin],err);
|
80
|
|
},closeSlidingMenu:function(result,state,err){
|
81
|
|
execute("closeSlidingMenu", [result,state],err);
|
82
|
|
}
|
83
|
|
};
|
84
|
|
})();
|
85
|
|
|
86
|
|
//全局变量
|
87
|
|
var callbackId = 0;
|
88
|
|
var callbacks = {};//用来存放成功和失败的js回调函数
|
89
|
|
var callbackDefine = {};//用来存放自定义的js回调函数
|
90
|
|
var globalErrorKey = null;//全局错误关键字,定位错误
|
91
|
|
|
92
|
|
/*绝大多数情况下,success回调函数是用不上的,有需要回调函数的时候异步方式传入取值*/
|
93
|
|
var isAlert = true;//防止反复弹出alert
|
94
|
|
var execute = function(action, args, error, success){
|
95
|
|
args = stringify(args);
|
96
|
|
if(terminalType=="a"){
|
97
|
|
androidExecute(action, args, error, success);
|
98
|
|
}else if(terminalType=="i"){
|
99
|
|
iosExecute(action, args, error, success);
|
100
|
|
}else if(terminalType=="w"){
|
101
|
|
winphoneExecute(action, args, error, success);
|
102
|
|
}else{
|
103
|
|
if(isAlert){
|
104
|
|
isAlert = false
|
105
|
|
alert(action+"无终端类型");
|
106
|
|
}else{
|
107
|
|
console.log(action+"无终端类型");
|
108
|
|
}
|
109
|
|
}
|
110
|
|
};
|
111
|
|
|
112
|
|
WadeMobile.execute = execute;
|
113
|
|
|
114
|
|
var androidExecute = function(action, args, error, success){
|
115
|
|
//执行回调方法时,回调方法的key值为,回调方法实际的key值 + 本iframe上保持的WadeMobile在top上的唯一标识
|
116
|
|
var tmpKey = action+callbackId++;
|
117
|
|
if(window._WadeMobileSet_Key_ != undefined){
|
118
|
|
tmpKey += window._WadeMobileSet_Key_;
|
119
|
|
}
|
120
|
|
var callbackKey = globalErrorKey = tmpKey;
|
121
|
|
if (success || error) {
|
122
|
|
callbacks[callbackKey] = {success:success, error:error};
|
123
|
|
}
|
124
|
|
if(WadeMobile.debug){
|
125
|
|
//alert("准备调用"+action+" 参数:"+args);
|
126
|
|
console.log("action:"+action+" param:"+args);
|
127
|
|
}
|
128
|
|
PluginManager.exec(action, callbackKey, args);
|
129
|
|
globalErrorKey = null;
|
130
|
|
};
|
131
|
|
|
132
|
|
var iosExecute = function(action, args, error, success){
|
133
|
|
var callbackKey = globalErrorKey = action+callbackId++;
|
134
|
|
if (success || error) {
|
135
|
|
callbacks[callbackKey] = {success:success, error:error};
|
136
|
|
}
|
137
|
|
if(WadeMobile.debug){
|
138
|
|
//alert("准备调用"+action+" 参数:"+args);
|
139
|
|
console.log("action:"+action+" param:"+args);
|
140
|
|
}
|
141
|
|
|
142
|
|
var WADE_SCHEME = "wade://";
|
143
|
|
var url = WADE_SCHEME+action+"?param="+encodeURIComponent(args)+"&callback="+callbackKey;
|
144
|
|
//一个动作请求客户端的最大数量,超过会造成请求覆盖
|
145
|
|
var limitAction = 10;
|
146
|
|
var ifrmName = "WADE_FRAME_"+(callbackId%limitAction);
|
147
|
|
var ifrm = document.getElementById(ifrmName);
|
148
|
|
if(!ifrm){
|
149
|
|
var ifrm = document.createElement("iframe");
|
150
|
|
ifrm.setAttribute("id",ifrmName);
|
151
|
|
ifrm.setAttribute("width","0");
|
152
|
|
ifrm.setAttribute("height","0");
|
153
|
|
ifrm.setAttribute("border","0");
|
154
|
|
ifrm.setAttribute("frameBorder","0");
|
155
|
|
ifrm.setAttribute("name",ifrmName);
|
156
|
|
document.body.appendChild(ifrm);
|
157
|
|
}
|
158
|
|
document.getElementById(ifrmName).contentWindow.location = encodeURIComponent(url);
|
159
|
|
//document.getElementById(ifrmName).src = encodeURI(url);//无法处理&符号
|
160
|
|
globalErrorKey = null;
|
161
|
|
};
|
162
|
|
|
163
|
|
var winphoneExecute = function(action, args, error, success){
|
164
|
|
var callbackKey = globalErrorKey = action+callbackId++;
|
165
|
|
if (success || error) {
|
166
|
|
callbacks[callbackKey] = {success:success, error:error};
|
167
|
|
}
|
168
|
|
if(WadeMobile.debug){
|
169
|
|
//alert("准备调用"+action+" 参数:"+args);
|
170
|
|
console.log("action:"+action+" param:"+args);
|
171
|
|
}
|
172
|
|
window.external.Notify(stringify([action, callbackKey, args])); //[action, callbackKey, args]
|
173
|
|
globalErrorKey = null;
|
174
|
|
};
|
175
|
|
|
176
|
|
WadeMobile.callback = (function(){
|
177
|
|
return{
|
178
|
|
success:function(callbackKey, message) {
|
179
|
|
if(typeof message == "undefined"){
|
180
|
|
return;
|
181
|
|
}
|
182
|
|
if (callbacks[callbackKey]) {
|
183
|
|
if (callbacks[callbackKey].success) {
|
184
|
|
if(typeof callbacks[callbackKey].success==="function"){
|
185
|
|
var func = callbacks[callbackKey].success;
|
186
|
|
func(message);
|
187
|
|
}else{
|
188
|
|
_eval(callbacks[callbackKey].success+"('"+message+"','"+callbackKey+"')");
|
189
|
|
}
|
190
|
|
}
|
191
|
|
if (callbacks[callbackKey]) {
|
192
|
|
delete callbacks[callbackKey];
|
193
|
|
}
|
194
|
|
}
|
195
|
|
},error:function(callbackKey, message, isEncode) {
|
196
|
|
if(typeof message == "undefined"){
|
197
|
|
return;
|
198
|
|
}
|
199
|
|
if(isEncode){
|
200
|
|
message = decodeURIComponent(message);
|
201
|
|
}
|
202
|
|
if (callbacks[callbackKey]) {
|
203
|
|
if (callbacks[callbackKey].error) {
|
204
|
|
if(typeof callbacks[callbackKey].error==="function"){
|
205
|
|
var func = callbacks[callbackKey].error;
|
206
|
|
func(message);
|
207
|
|
}else{
|
208
|
|
_eval(callbacks[callbackKey].error+"('"+message+"','"+callbackKey+"')");
|
209
|
|
}
|
210
|
|
}
|
211
|
|
if (callbacks[callbackKey]) {
|
212
|
|
delete callbacks[callbackKey];
|
213
|
|
}
|
214
|
|
}else{
|
215
|
|
alert(message);
|
216
|
|
}
|
217
|
|
},storageCallback:function(action,callback){
|
218
|
|
var callbackKey = action+callbackId;
|
219
|
|
if (callback) {
|
220
|
|
callbackDefine[callbackKey] = {callback:callback};
|
221
|
|
}
|
222
|
|
},execCallback:function(callbackKey, data, isEncode){
|
223
|
|
globalErrorKey = callbackKey;
|
224
|
|
var callbackItem = callbackDefine[callbackKey];
|
225
|
|
if (callbackItem) {
|
226
|
|
data = data=="null"?null:data;
|
227
|
|
if(data){
|
228
|
|
if(isEncode){
|
229
|
|
data = decodeURIComponent(data);
|
230
|
|
}
|
231
|
|
}
|
232
|
|
if (callbackItem.callback) {
|
233
|
|
if(typeof callbackItem.callback==="function"){
|
234
|
|
var func = callbackItem.callback;
|
235
|
|
func(data);
|
236
|
|
}else{
|
237
|
|
_eval(callbackItem.callback+"('"+data+"','"+callbackKey+"')");
|
238
|
|
}
|
239
|
|
}
|
240
|
|
if (callbackItem) {
|
241
|
|
delete callbackDefine[callbackKey];
|
242
|
|
}
|
243
|
|
}
|
244
|
|
globalErrorKey = null;
|
245
|
|
}
|
246
|
|
};
|
247
|
|
})();
|
248
|
|
|
249
|
|
WadeMobile.event = (function(){
|
250
|
|
if(WadeMobile.isApp()){
|
251
|
|
var e = document.createEvent('Events');
|
252
|
|
return {
|
253
|
|
back:function(){
|
254
|
|
e.initEvent('backKeyDown');
|
255
|
|
document.dispatchEvent(e);
|
256
|
|
},menu:function(){
|
257
|
|
e.initEvent('menuKeyDown');
|
258
|
|
document.dispatchEvent(e);
|
259
|
|
},search:function(){
|
260
|
|
e.initEvent('searchKeyDown');
|
261
|
|
document.dispatchEvent(e);
|
262
|
|
}
|
263
|
|
};
|
264
|
|
}
|
265
|
|
})();
|
266
|
|
|
267
|
|
/************公共方法**************/
|
268
|
|
/**
|
269
|
|
* @param {String} errorMessage 错误信息
|
270
|
|
* @param {String} scriptURI 错误文件
|
271
|
|
* @param {Long} lineNumber 错误行号
|
272
|
|
*/
|
273
|
|
window.onerror = function(errorMessage, scriptURI, lineNumber) {
|
274
|
|
var msgArray = new Array();
|
275
|
|
if (errorMessage)
|
276
|
|
msgArray.push("错误信息:" + errorMessage);
|
277
|
|
if (lineNumber)
|
278
|
|
msgArray.push("错误行号:" + lineNumber);
|
279
|
|
if (globalErrorKey)
|
280
|
|
msgArray.push("错误关键字:" + globalErrorKey);
|
281
|
|
if (scriptURI)
|
282
|
|
msgArray.push("错误文件:" + scriptURI);
|
283
|
|
var msg = msgArray.join("\t\n");
|
284
|
|
console.log(msg);
|
285
|
|
alert(msg);
|
286
|
|
};
|
287
|
|
|
288
|
|
//动态执行js方法
|
289
|
|
function _eval(code,action){
|
290
|
|
if(WadeMobile.debug){
|
291
|
|
alert(code);
|
292
|
|
}
|
293
|
|
var func = eval(code);
|
294
|
|
if(typeof func==="function"){
|
295
|
|
func();
|
296
|
|
}
|
297
|
|
}
|
298
|
|
//格式转换方法
|
299
|
|
function stringify(args) {
|
300
|
|
if (typeof JSON == "undefined") {
|
301
|
|
var s = "[";
|
302
|
|
for (var i=0; i<args.length; i++) {
|
303
|
|
if (i > 0) {
|
304
|
|
s = s + ",";
|
305
|
|
}
|
306
|
|
var type = typeof args[i];
|
307
|
|
if ((type == "number") || (type == "boolean")) {
|
308
|
|
s = s + args[i];
|
309
|
|
}
|
310
|
|
else if (args[i] instanceof Array) {
|
311
|
|
s = s + "[" + args[i] + "]";
|
312
|
|
}
|
313
|
|
else if (args[i] instanceof Object) {
|
314
|
|
var start = true;
|
315
|
|
s = s + '{';
|
316
|
|
for (var name in args[i]) {
|
317
|
|
if (args[i][name] != null) {
|
318
|
|
if (!start) {
|
319
|
|
s = s + ',';
|
320
|
|
}
|
321
|
|
s = s + '"' + name + '":';
|
322
|
|
var nameType = typeof args[i][name];
|
323
|
|
if ((nameType == "number") || (nameType == "boolean")) {
|
324
|
|
s = s + args[i][name];
|
325
|
|
}
|
326
|
|
else if ((typeof args[i][name]) == 'function') {
|
327
|
|
// don't copy the functions
|
328
|
|
s = s + '""';
|
329
|
|
}
|
330
|
|
else if (args[i][name] instanceof Object) {
|
331
|
|
s = s + stringify(args[i][name]);
|
332
|
|
}
|
333
|
|
else {
|
334
|
|
s = s + '"' + args[i][name] + '"';
|
335
|
|
}
|
336
|
|
start=false;
|
337
|
|
}
|
338
|
|
}
|
339
|
|
s = s + '}';
|
340
|
|
}else {
|
341
|
|
var a = args[i].replace(/\\/g, '\\\\');
|
342
|
|
a = a.replace(/"/g, '\\"');
|
343
|
|
s = s + '"' + a + '"';
|
344
|
|
}
|
345
|
|
}
|
346
|
|
s = s + "]";
|
347
|
|
return s;
|
348
|
|
}else {
|
349
|
|
return JSON.stringify(args);
|
350
|
|
}
|
351
|
|
};
|
352
|
|
|
353
|
|
return WadeMobile;
|
354
|
|
})();
|
355
|
|
|
356
|
|
//让top对象上,保持有一个当前iframe里面的WadeMobile对象的引用。
|
357
|
|
//注意:在iframe中,_WadeMobileSet_Key_+时间戳表示一个key,此key作为了在top对象上索引iframe中的WadeMobile的依据。
|
358
|
|
//将保持引用的key值存入到当前ifame的window对象上。
|
359
|
|
(function(){
|
360
|
|
if(top != window){
|
361
|
|
if(top.WadeMobileSet == undefined){
|
362
|
|
top.WadeMobileSet = {};
|
363
|
|
}
|
364
|
|
for(var key in top.WadeMobileSet){
|
365
|
|
if( key.indexOf("_WadeMobileSet_Key_") != -1 && ( !top.WadeMobileSet[key] || ( top.WadeMobileSet[key].canRemoved && top.WadeMobileSet[key].canRemoved() ) ) ){
|
366
|
|
delete top.WadeMobileSet[key];
|
367
|
|
}
|
368
|
|
}
|
369
|
|
var key = "_WadeMobileSet_Key_" + new Date().getTime();
|
370
|
|
window._WadeMobileSet_Key_ = key;
|
371
|
|
console.log("In an iframe, window.WadeMobile object is referenced top.WadeMobileSet." + key);
|
372
|
|
top.WadeMobileSet[key] = window.WadeMobile;
|
373
|
|
window.WadeMobile.canRemoved = function(){
|
374
|
|
return !window;
|
375
|
|
};
|
376
|
|
}
|
377
|
|
})();
|