common.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203
  1. /*+++++通用函数脚本++++++++*/
  2. var colorBackground = "#243f6d"; // 3255ee
  3. var colorBackground01 = "#243f6dDD"; // 3255ee
  4. var colorTitle = "#FFFFFF";
  5. var colorLine = "#00323af1";
  6. var eChartsResetTime = 50000; //统计图表重制时间周期
  7. /* +++++++++++屏幕适配++++++++++ */
  8. var PageSize = {
  9. smartSize: 600,
  10. middleSize: 1400,
  11. }
  12. /**
  13. * APP 获取GPS位置
  14. * @param {Object} callback 成功获取后回调
  15. */
  16. function plusGetLocation(callback) {
  17. mui.plusReady(function() {
  18. //获取位置信息
  19. plus.geolocation.getCurrentPosition(function(position) {
  20. var lng = position.coords.longitude;
  21. var lat = position.coords.latitude;
  22. // callback(lat, lng);
  23. callback(35.159, 118.203)
  24. }, function(e) {
  25. mui.alert(e.message);
  26. }, {
  27. provider: 'system',
  28. coordsType: 'wgs84',
  29. geocode: false,
  30. enableHighAccuracy: true, //这个布尔值用来表明应用是否使用其最高精度来表示结果。如果值为 true ,同时设备能够提供一个更精确的位置,那么设备就会使用这个位置
  31. maximumAge: 0, //它表明可以返回多长时间(即最长年龄,单位毫秒)内的可获取的缓存位置。如果设置为 0, 说明设备不能使用一个缓存位置
  32. });
  33. });
  34. }
  35. /* 方向监听标识Id */
  36. let watchOrientationId = undefined;
  37. /**
  38. * 开启方向变化监听
  39. * @param {Function} callChange 变化回调callChange(角度)
  40. */
  41. function plusOrientationListenerOn(callChange) {
  42. mui.plusReady(function() {
  43. watchOrientationId = plus.orientation.watchOrientation(function(o) {
  44. // console.log("精度指标 = " + o.headingAccuracy);
  45. if (callChange) callChange(o.trueHeading);
  46. }, function(err) {
  47. console.log("方向错误 = " + e.message);
  48. }, {
  49. frequency: 100,
  50. });
  51. })
  52. }
  53. /**
  54. * 关闭方向监听
  55. * @param {Function} callCompletion 完成回到callCompletion()
  56. */
  57. function plusOrientationListenerOff(callCompletion) {
  58. if (watchOrientationId) {
  59. plus.orientation.clearWatch(watchOrientationId);
  60. watchOrientationId = undefined;
  61. if (callCompletion) callCompletion();
  62. }
  63. }
  64. /* GPS位置监听 */
  65. let watchGpsId = undefined;
  66. /**
  67. * 开启GPS位置变化监听
  68. * @param {Function} callChange GPS位置变化回调callChange(纬度,经度);
  69. */
  70. function plusGPSListenerOn(callChange, callError) {
  71. mui.plusReady(function() {
  72. watchGpsId = plus.geolocation.watchPosition(function(p) {
  73. if (callChange) callChange(p.coords.latitude, p.coords.longitude);
  74. }, function(err) {
  75. if (callError) callError('GPS定位失败,请确保开启定位服务及权限!');
  76. console.log('定位错误 = ' + err.message);
  77. }, {
  78. provider: 'system',
  79. coordsType: 'wgs84',
  80. geocode: false,
  81. enableHighAccuracy: true, //这个布尔值用来表明应用是否使用其最高精度来表示结果。如果值为 true ,同时设备能够提供一个更精确的位置,那么设备就会使用这个位置
  82. maximumAge: 0, //它表明可以返回多长时间(即最长年龄,单位毫秒)内的可获取的缓存位置。如果设置为 0, 说明设备不能使用一个缓存位置
  83. });
  84. })
  85. }
  86. /**
  87. * 关闭GPS位置监听
  88. * @param {Function} callCompletion 完成回到callCompletion()
  89. */
  90. function plusGPSListenerOff(callCompletion) {
  91. if (watchGpsId) {
  92. plus.geolocation.clearWatch(watchGpsId);
  93. watchGpsId = undefined;
  94. if (callCompletion) callCompletion();
  95. }
  96. }
  97. /**
  98. * 加载顶部导航栏
  99. * @param {Object} title 导航栏标题
  100. * @param {Object} showBackButton 导航栏是否具备返回按钮
  101. */
  102. function plusSetNavbar(title, showBackButton) {
  103. var ws = plus.webview.currentWebview();
  104. //设置导航条
  105. ws.setStyle({
  106. "titleNView": {
  107. backgroundColor: colorBackground,
  108. titleText: title,
  109. titleColor: colorTitle,
  110. autoBackButton: showBackButton,
  111. splitLine: {
  112. color: colorLine
  113. }
  114. }
  115. });
  116. }
  117. /**
  118. * 加载顶部导航栏
  119. * @param {Object} title 导航栏标题
  120. * @param {Object} showBackButton 导航栏是否具备返回按钮
  121. */
  122. function plusSetNavbarRef(title, showBackButton, callback) {
  123. var ws = plus.webview.currentWebview();
  124. //设置导航条
  125. ws.setStyle({
  126. "titleNView": {
  127. backgroundColor: colorBackground,
  128. titleText: title,
  129. titleColor: colorTitle,
  130. autoBackButton: showBackButton,
  131. splitLine: {
  132. color: colorLine
  133. },
  134. buttons: [{
  135. 'float': 'right',
  136. fontSrc: '../fonts/iconfont.ttf',
  137. text: '\ueb73',
  138. onclick: callback,
  139. }]
  140. }
  141. });
  142. }
  143. /**
  144. * UIWebView加载完成 大多数方法建议放到此处运行
  145. * @param {Object} callback
  146. */
  147. function UIView_DidLoad(callback) {
  148. mui.plusReady(function() {
  149. // var self = plus.webview.currentWebview();
  150. // //添加显示监听
  151. // self.addEventListener('show', function() {
  152. callback();
  153. // });
  154. });
  155. }
  156. /**
  157. * 输出控制台消息
  158. * @param {Object} msg 消息内容
  159. */
  160. function printToConsole(msg) {
  161. console.log(msg);
  162. }
  163. /**
  164. * 日期格式化
  165. * @param {Object} fmt 格式化字符串
  166. */
  167. Date.prototype.Format = function(fmt) {
  168. var o = {
  169. "M+": this.getMonth() + 1, //月份
  170. "d+": this.getDate(), //日
  171. "H+": this.getHours(), //小时
  172. "m+": this.getMinutes(), //分
  173. "s+": this.getSeconds(), //秒
  174. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  175. "S": this.getMilliseconds() //毫秒
  176. };
  177. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  178. for (var k in o)
  179. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((
  180. "00" + o[
  181. k]).substr(("" + o[k]).length)));
  182. return fmt;
  183. }
  184. /**
  185. * @param {JSON} options 图片路径
  186. * path{string}:图片路径
  187. * lable{string}:文字描述
  188. * click{function}:回调函数
  189. */
  190. function createBigMenu(options) {
  191. var li = document.createElement("li");
  192. li.className = 'mui-table-view-cell mui-media mui-col-xs-3 mui-col-sm-3';
  193. var liHtml = "";
  194. liHtml += "<div class='cr-menu-panel'>";
  195. liHtml += "<img src='" + options.path + "'>";
  196. liHtml += "<span>" + options.label + "</span>";
  197. liHtml += "</div>";
  198. li.innerHTML = liHtml;
  199. if (options.click != undefined) li.onclick = function() {
  200. options.click();
  201. };
  202. return li;
  203. }
  204. /**
  205. * @param {JSON} options 图片路径
  206. * path{string}:图片路径
  207. * lable{string}:文字描述
  208. * click{function}:回调函数
  209. */
  210. function createSmartMenu(options) {
  211. var li = document.createElement("li");
  212. li.className = 'mui-table-view-cell mui-media mui-col-xs-3 mui-col-sm-3';
  213. var liHtml = "";
  214. liHtml += "<div class='cr-menu-smart-panel'>";
  215. liHtml += "<img src='" + options.path + "'>";
  216. liHtml += "<span>" + options.label + "</span>";
  217. liHtml += "</div>";
  218. li.innerHTML = liHtml;
  219. if (options.click != undefined) {
  220. li.onclick = function() {
  221. options.click('options');
  222. };
  223. }
  224. return li;
  225. }
  226. /**
  227. * 创建菜单Html
  228. * @param {JSON} options 图片路径
  229. * path{string}:图片路径
  230. * lable{string}:文字描述
  231. * click{function}:回调函数
  232. */
  233. function createSmartMenuHtml(options) {
  234. var menuHtml = "<li class='mui-table-view-cell mui-media mui-col-xs-3 mui-col-sm-3'";
  235. if (options.idx != undefined) {
  236. menuHtml += " idx='" + options.idx + "'";
  237. }
  238. menuHtml += " onclick='" + options.click + "()'>";
  239. menuHtml += "<div class='cr-menu-smart-panel'>";
  240. menuHtml += "<img src='" + options.path + "'>";
  241. menuHtml += "<span>" + options.label + "</span>";
  242. menuHtml += "</div>";
  243. menuHtml += "</li>";
  244. return menuHtml;
  245. }
  246. /**
  247. * 创建并打开页面
  248. * @param {JSON} options 配置项
  249. * htmlPath{string}:页面路径
  250. * top{number/undefined 可选项}:窗口距离顶端高度
  251. * bottom{number/undefined 可选项}:窗口距离底部高度
  252. * backgroundColor{color 可选项}:导航栏背景色
  253. * lineColor{color 可选项}:导航栏底框颜色
  254. * title{string}:导航栏标题
  255. * statusbar:{boolean 可选项}:状态栏是否透明
  256. * extras{JSON 可选项}:传递参数
  257. * showSlide{string 可选项}:动画方式 slide-in-bottom
  258. * isShow{boolean}:是否默认显示
  259. */
  260. function createAndOpenPage(options) {
  261. var viewId = options.id == undefined ? options.htmlPath : options.id;
  262. UIView_DidLoad(function() {
  263. var pageConfig = {
  264. "titleNView": {
  265. backgroundColor: options.backgroundColor == undefined ? colorBackground : options
  266. .backgroundColor,
  267. titleColor: options.titleColor == undefined ? colorTitle : options.titleColor,
  268. autoBackButton: options.autoback == undefined ? false : options.autoback,
  269. titleText: options.title,
  270. splitLine: {
  271. color: options.lineColor == undefined ? colorLine : options.lineColor,
  272. }
  273. },
  274. top: options.top == undefined ? '0' : options.top,
  275. bottom: options.bottom == undefined ? '0' : options.bottom,
  276. contentAdjust: false
  277. }
  278. /* 判断是否增加了按钮配置 */
  279. if (options.buttons != undefined) {
  280. pageConfig.titleNView.buttons = options.buttons;
  281. }
  282. /* 配置sttusbar 主要是为了配置任务栏的背景色 */
  283. if (options.statusbar != undefined && !options.statusbar) {
  284. pageConfig.statusbar = {
  285. background: colorBackground,
  286. }
  287. }
  288. /* 判断是否设置了高度 */
  289. if (options.height != undefined) {
  290. pageConfig.height = options.height;
  291. }
  292. /* 根据是否传参决定采用何种方式加载 */
  293. var subPage = undefined;
  294. if (options.extras != undefined) {
  295. subPage = plus.webview.create(options.htmlPath, viewId, pageConfig, options.extras);
  296. } else {
  297. subPage = plus.webview.create(options.htmlPath, viewId, pageConfig);
  298. }
  299. // subPage.addEventListener('show', function() {
  300. // subPage.evalJS('pageFirstShow()');
  301. // }, false);
  302. subPage.onloaded = function(e) {
  303. if (options.onloaded != undefined) options.onloaded(subPage);
  304. }
  305. /* 是否显示 */
  306. if (options.isShow == undefined || options.isShow == true) {
  307. /* 显示动画 */
  308. if (options.showSlide == undefined) {
  309. subPage.show('slide-in-right', 300);
  310. } else {
  311. subPage.show(options.showSlide, 300);
  312. }
  313. } else {
  314. subPage.hide();
  315. }
  316. if (options.success != undefined) options.success(subPage);
  317. });
  318. }
  319. /**
  320. * 获取值 对0值进行特殊处理
  321. * @param {string} strValue 字符串或其他
  322. */
  323. function getEChartsValue(strValue) {
  324. var value = parseFloat(strValue)
  325. if (value == 0) {
  326. return 0.1;
  327. } else {
  328. return value;
  329. }
  330. }
  331. /**
  332. * 验证Ip地址
  333. * @param {string} ip 输入的ip地址
  334. */
  335. function isValidIP(ip) {
  336. var reg =
  337. /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
  338. return reg.test(ip);
  339. }
  340. /**
  341. * 验证Com端口号
  342. * @param {string} com 输入的com端口号
  343. */
  344. function isValidCom(com) {
  345. var reg =
  346. /^(\d{4,4})$/
  347. return reg.test(com);
  348. }
  349. /**
  350. * 验证电话号码
  351. * @param {string} phoneNumber 输入的电话号码
  352. */
  353. function isValidPhone(phoneNumber) {
  354. var reg =
  355. /^(\d{11,11})$/
  356. return reg.test(phoneNumber);
  357. }
  358. /**
  359. * 获取配置信息
  360. * @param {function} callback 回调函数
  361. */
  362. function getConfigInfo(callback) {
  363. mui.plusReady(function() {
  364. plus.runtime.getProperty(plus.runtime.appid, function(info) {
  365. plus.io.resolveLocalFileSystemURL('_www/manifest.json', function(entry) {
  366. entry.file(function(file) {
  367. var fileReader = new plus.io.FileReader();
  368. fileReader.readAsText(file, 'utf-8');
  369. fileReader.onloadend = function(evt) {
  370. var data = JSON.parse(evt.target.result);
  371. if (callback != undefined) {
  372. callback({
  373. appid: info.appid,
  374. version: info.version,
  375. versionCode: info.versionCode,
  376. name: info.name,
  377. devName: data.developer.name,
  378. devUrl: data.developer.url,
  379. devEmail: data.developer.email,
  380. devPhone: data.developer.phone,
  381. devTel: data.developer.tel,
  382. devCopyright: data.developer.copyright,
  383. })
  384. }
  385. }
  386. }, function(err) {
  387. printToConsole("读取文件错误:" + JSON.stringify(err));
  388. });
  389. }, function(err) {
  390. printToConsole("获取文件错误:" + JSON.stringify(err));
  391. });
  392. });
  393. });
  394. }
  395. /**
  396. * 生成随机颜色
  397. * @param {Array} red [0~255,0~255]
  398. * @param {Array} green [0~255,0~255]
  399. * @param {Array} blue [0~255,0~255]
  400. * return rgb(r,g,b)
  401. */
  402. function randomRgbColor(red, green, blue) { //随机生成RGB颜色
  403. var rStart = red[1] - red[0];
  404. var gStart = green[1] - green[0];
  405. var bStart = blue[1] - blue[0];
  406. var r = Math.floor(Math.random() * rStart + red[0]); //随机生成256以内r值
  407. var g = Math.floor(Math.random() * gStart + green[0]); //随机生成256以内g值
  408. var b = Math.floor(Math.random() * bStart + blue[0]); //随机生成256以内b值
  409. var color = 'rgb(' + r + ',' + g + ',' + b + ')';
  410. return color; //返回rgb(r,g,b)格式颜色
  411. }
  412. /**
  413. * 显示顶部日期+时间
  414. */
  415. var strDate = '';
  416. /**
  417. * 内部函数
  418. * 显示当前日期和时间
  419. */
  420. function _showTopTime() {
  421. /* 修改展示方式 */
  422. var strDay = new Date().Format('dd');
  423. var strYearAndMonth = new Date().Format('yyyy.MM')
  424. var strYear = new Date().Format('yyyy')
  425. var strMonth = new Date().Format('MM')
  426. var strDay = new Date().Format('dd')
  427. var china = calendar.solar2lunar(strYear, strMonth, strDay);
  428. var chinaDay = " 农历" + china.Animal + "年" + china.IMonthCn + china.IDayCn + " " + china.ncWeek;
  429. var time = new Date().Format('HH:mm:ss');
  430. var timeHtml = "";
  431. timeHtml += "<span>" + strDay + "</span>";
  432. timeHtml += "<span>" + strYearAndMonth + "</span>";
  433. timeHtml += "<span>" + chinaDay + "</span>";
  434. timeHtml += "<span>" + time + "</span>";
  435. $('.topTime').html(timeHtml);
  436. }
  437. /**
  438. * 开始显示日期
  439. */
  440. function beginShowTime() {
  441. _showTopTime();
  442. window.setInterval(_showTopTime, 1000);
  443. }
  444. /**
  445. * 创建轮播项
  446. * @param {string} imgPath 图片路径
  447. * @param {boolean} isFistOrLast 是否是第一项或最后一项
  448. */
  449. function _createSliderItemHtml(imgPath, isFistOrLast) {
  450. var divHtml = "";
  451. if (isFistOrLast) {
  452. divHtml += "<div class='mui-slider-item mui-slider-item-duplicate'>";
  453. } else {
  454. divHtml += "<div class='mui-slider-item'>";
  455. }
  456. divHtml += "<a href='#'>";
  457. divHtml += "<img src='" + imgPath + "'/>";
  458. divHtml += "</a>";
  459. divHtml += "</div>";
  460. return divHtml;
  461. }
  462. /**
  463. * 根据图片路径数组初始化轮播内容
  464. * @param {string} sliderId 轮播容器Id
  465. * @param {Array} sliderImages 轮播图片路径数组
  466. */
  467. function _initSliderContent(sliderId, sliderImages) {
  468. var sliderHtml = ""; //轮播内容
  469. var indicatorHtml = ""; //轮播指示器内容
  470. /* 额外增加的一个节点(循环轮播:第一个节点是最后一张轮播) */
  471. sliderHtml += _createSliderItemHtml(sliderImages[sliderImages.length - 1], true);
  472. for (var i = 0; i < sliderImages.length; i++) {
  473. sliderHtml += _createSliderItemHtml(sliderImages[i], false);
  474. if (i === 0) indicatorHtml += "<div class='mui-indicator mui-active'></div>";
  475. else indicatorHtml += "<div class='mui-indicator'></div>";
  476. }
  477. /* 额外增加的一个节点(循环轮播:最后一个节点是第一张轮播) */
  478. sliderHtml += _createSliderItemHtml(sliderImages[0], false);
  479. /* 组合展示 */
  480. var strHtml = "<div class='mui-slider-group mui-slider-loop'>";
  481. strHtml += sliderHtml;
  482. strHtml += "</div>";
  483. strHtml += "<div class='mui-slider-indicator'>";
  484. strHtml += indicatorHtml;
  485. strHtml += "</div>";
  486. $("#" + sliderId).html(strHtml);
  487. }
  488. /**
  489. * 启动图片轮播
  490. * @param {string} sliderId 轮播容器Id
  491. * @param {Array} imagePaths 图片路径数组
  492. * @param {int} sliderTimespan 轮播时间间隔 0 代表不轮播
  493. */
  494. function beginSliderContent(sliderId, imagePaths, sliderTimespan) {
  495. _initSliderContent(sliderId, imagePaths);
  496. /* 自动轮播 */
  497. var slider = mui('#' + sliderId);
  498. if (sliderTimespan > 0) {
  499. slider.slider({
  500. interval: sliderTimespan,
  501. });
  502. }
  503. }
  504. /**
  505. * 设置样式中变量的值
  506. * @param {string} variable 变量
  507. * @param {string} value 值
  508. */
  509. function setPropertyFromStyle(variable, value) {
  510. document.documentElement.style.setProperty(variable, value);
  511. }
  512. /* 给选择类型按钮添加监听 */
  513. function addListenerToSelectButton(btnDomId, config) {
  514. var btn = $("#" + btnDomId)[0];
  515. btn.addEventListener('tap', function() {
  516. var _self = this;
  517. if (_self.picker) {
  518. _self.picker.show(function(selectItems) {
  519. $(_self).html(selectItems[0].text);
  520. $(_self).attr('data-value', selectItems[0].text);
  521. $(_self).attr('data-code', selectItems[0].value);
  522. });
  523. } else {
  524. _self.picker = new mui.PopPicker({
  525. buttons: ['清除', '使用']
  526. });
  527. _self.picker.setData(config);
  528. _self.picker.cancel.addEventListener('tap', function() {
  529. $(_self).html($(_self).attr('value'));
  530. $(_self).attr('data-value', "");
  531. $(_self).attr('data-code', "");
  532. })
  533. _self.picker.show(function(selectItems) {
  534. $(_self).html(selectItems[0].text);
  535. $(_self).attr('data-value', selectItems[0].text);
  536. $(_self).attr('data-code', selectItems[0].value);
  537. });
  538. }
  539. })
  540. }
  541. /**
  542. *
  543. * @param {string} btnDomId 需要绑定的选择器Id
  544. * @param {string} tabName 选择器关联的表名
  545. * @param {string} fldName 选择器关联的字段名
  546. * @param {function} callback 选择回调函数
  547. */
  548. function bindListenerToSelectButton(btnDomId, tabName, fldName, callback) {
  549. var btn = $("#" + btnDomId)[0];
  550. btn.addEventListener('tap', function() {
  551. var _self = this;
  552. /* 首先进行查询 */
  553. querySimpleFieldInfo(tabName, fldName, function(config) {
  554. if (_self.picker) {
  555. _self.picker.setData(config);
  556. _self.picker.show(function(selectItems) {
  557. $(_self).html(selectItems[0].text);
  558. $(_self).attr('data-value', selectItems[0].text);
  559. $(_self).attr('data-code', selectItems[0].value);
  560. if (callback) callback(selectItems[0].text, selectItems[0].value);
  561. });
  562. } else {
  563. _self.picker = new mui.PopPicker({
  564. buttons: ['清除', '使用']
  565. });
  566. _self.picker.setData(config);
  567. _self.picker.cancel.addEventListener('tap', function() {
  568. $(_self).html($(_self).attr('value'));
  569. $(_self).attr('data-value', "");
  570. $(_self).attr('data-code', "");
  571. })
  572. _self.picker.show(function(selectItems) {
  573. $(_self).html(selectItems[0].text);
  574. $(_self).attr('data-value', selectItems[0].text);
  575. $(_self).attr('data-code', selectItems[0].value);
  576. if (callback) callback(selectItems[0].text, selectItems[0].value);
  577. });
  578. }
  579. });
  580. })
  581. }
  582. /**
  583. * 绑定日期控件
  584. * @param {string} btnDomId 需要绑定的选择器Id
  585. * @param {function} callback 选择回调函数
  586. */
  587. function bindListenerToDateButton(btnDomId, callback) {
  588. var btn = $("#" + btnDomId)[0];
  589. btn.addEventListener('tap', function() {
  590. var _self = this;
  591. if (_self.picker) {
  592. _self.picker.show(function(selectItems) {
  593. $(_self).html(selectItems.text);
  594. $(_self).attr('data-value', selectItems.text);
  595. $(_self).attr('data-code', selectItems.value);
  596. _self.picker.dispose();
  597. _self.picker = null;
  598. if (callback) callback(selectItems.text, selectItems.value);
  599. });
  600. } else {
  601. /* 获取存储的值 */
  602. let value = $(_self).attr("data-value") || '';
  603. // console.log("存储 = " + value);
  604. _self.picker = new mui.DtPicker({
  605. buttons: ['清除', '使用'],
  606. type: 'date',
  607. beginDate: new Date('1990', '1', '1'),
  608. endDate: new Date('2050', '12', '31'),
  609. value: value,
  610. });
  611. _self.picker.ui.cancel.addEventListener('tap', function() {
  612. $(_self).html($(_self).attr('value'));
  613. $(_self).attr('data-value', "");
  614. $(_self).attr('data-code', "");
  615. });
  616. _self.picker.show(function(selectItems) {
  617. $(_self).html(selectItems.text);
  618. $(_self).attr('data-value', selectItems.text);
  619. $(_self).attr('data-code', selectItems.value);
  620. _self.picker.dispose();
  621. _self.picker = null;
  622. if (callback) callback(selectItems.text, selectItems.value);
  623. });
  624. }
  625. })
  626. }
  627. /**
  628. * 查询单字段信息
  629. * @param {string} tabName 表名称
  630. * @param {string} fldName 字段名称
  631. * @param {function} callSuccess 成功回调函数
  632. */
  633. function querySimpleFieldInfo(tabName, fldName, callSuccess) {
  634. var iData = {
  635. tabName: tabName,
  636. fldName: fldName,
  637. }
  638. /* 查询结果 */
  639. var result = [];
  640. /* 开始联网查询 */
  641. sendAjax({
  642. waitMessate: '同步数据...',
  643. url: 'appQuerySimpleFiled',
  644. data: iData,
  645. success: function(resData) {
  646. for (var i in resData) {
  647. result.push({
  648. value: resData[i].selCode,
  649. text: resData[i].selName,
  650. })
  651. }
  652. if (callSuccess != undefined) callSuccess(result);
  653. },
  654. error: function(err) {
  655. muiAlertError(err);
  656. }
  657. })
  658. }
  659. /**
  660. * 清除选择器
  661. * @param {string} btnDomId 选择控件Id
  662. */
  663. function clearSelectButton(btnDomId) {
  664. console.log("调用清除!");
  665. var _self = document.getElementById(btnDomId);
  666. if (_self.picker) {
  667. _self.picker.setData([]);
  668. }
  669. $(_self).html($(_self).attr('value'));
  670. $(_self).attr('data-value', "");
  671. $(_self).attr('data-code', "");
  672. }
  673. /**
  674. * 联网获取并设置单项选择器
  675. * @param {JSON} options
  676. * tabName{string}:表名称
  677. * fldName{string}:字段名称
  678. * btnDomId{string}:挂接容器
  679. */
  680. function setSimpleConfig(options) {
  681. var iData = {
  682. tabName: options.tabName,
  683. fldName: options.fldName,
  684. }
  685. var btn = $("#" + options.btnDomId)[0];
  686. var dataConfig = [];
  687. sendAjax({
  688. waitMessate: '同步数据...',
  689. url: 'appQuerySimpleFiled',
  690. data: iData,
  691. success: function(resData) {
  692. for (var i in resData) {
  693. dataConfig.push({
  694. value: resData[i].selCode,
  695. text: resData[i].selName,
  696. })
  697. }
  698. btn.addEventListener('tap', function() {
  699. var _self = this;
  700. if (_self.picker) {
  701. _self.picker.show(function(selectItems) {
  702. $(_self).html(selectItems[0].text);
  703. $(_self).attr('data-value', selectItems[0].text);
  704. });
  705. } else {
  706. _self.picker = new mui.PopPicker({
  707. buttons: ['清除', '使用']
  708. });
  709. _self.picker.setData(dataConfig);
  710. _self.picker.cancel.addEventListener('tap', function() {
  711. $(_self).html($(_self).attr('value'));
  712. $(_self).attr('data-value', "");
  713. })
  714. _self.picker.show(function(selectItems) {
  715. $(_self).html(selectItems[0].text);
  716. $(_self).attr('data-value', selectItems[0].text);
  717. });
  718. }
  719. })
  720. if (options.success != undefined) options.success();
  721. },
  722. error: function(err) {
  723. if (options.error != undefined) options.error(err);
  724. }
  725. })
  726. }
  727. /**
  728. * 定位图斑
  729. * @param {string} longitude 经度
  730. * @param {string} latitude 纬度
  731. * @param {string} title 标题
  732. */
  733. function toMapLocation(longitude, latitude, title) {
  734. var lMapId = 'FeatureLocationByMap';
  735. /* 启动定位之前判断是否存在 */
  736. mui.plusReady(function() {
  737. var mapPageView = plus.webview.getWebviewById(lMapId);
  738. if (mapPageView != null) {
  739. plus.webview.show(mapPageView, 'slide-in-right', 300, function() {
  740. mapPageView.evalJS("jsLocation('" + longitude + "','" + latitude +
  741. "','" + title + "')")
  742. });
  743. } else {
  744. muiAlert("地图页面尚未加载,请稍后重试!");
  745. }
  746. });
  747. }
  748. /**
  749. * 通过表名和要素Id定位图斑要素
  750. * @param {string} tabName 经度
  751. * @param {string} feaId 纬度
  752. * @param {string} title 标题
  753. */
  754. function toMapLocation_tabName_feaId(tabName, feaId, title) {
  755. var lMapId = 'FeatureLocationByMap';
  756. /* 启动定位之前判断是否存在 */
  757. mui.plusReady(function() {
  758. var mapPageView = plus.webview.getWebviewById(lMapId);
  759. if (mapPageView != null) {
  760. plus.webview.show(mapPageView, 'slide-in-right', 300, function() {
  761. mapPageView.evalJS("jsLocation_tabName_feaId('" + tabName + "','" + feaId +
  762. "','" + title + "')");
  763. });
  764. } else {
  765. muiAlert("地图定位页面异常,请稍后重试!");
  766. }
  767. });
  768. }
  769. /**
  770. * 启动App
  771. * @param {string} appId App的Id
  772. * @param {string} appName App的名称
  773. */
  774. function beginApp(appId, appName) {
  775. mui.plusReady(function() {
  776. if (plus.runtime.isApplicationExist({
  777. pname: appId
  778. })) {
  779. plus.runtime.launchApplication({
  780. pname: appId,
  781. }, function(e) {
  782. muiAlertError("启动失败:" + e.message);
  783. });
  784. } else {
  785. muiAlert('您尚未安装' + appName + ',请安装后重试!', "警告")
  786. }
  787. });
  788. }
  789. /**
  790. * 获取页面的宽、高
  791. */
  792. function getPageSize() {
  793. return {
  794. width: document.body.clientWidth,
  795. height: document.body.clientHeight
  796. }
  797. }
  798. /**
  799. * 显示完整内容
  800. * @param {string} content
  801. */
  802. function showContent(content) {
  803. muiAlert(content, "提示");
  804. }
  805. /**
  806. * 文本循环移动动画 适用于容器内展示span且span宽度超过div宽度
  807. * @param {string} domId 容器Id
  808. * @param {int} time 动画时间,单位ms
  809. */
  810. function textMoveAnimateById(domId, time) {
  811. var obj = $("#" + domId);
  812. var widthSpan = $("#" + domId + ">span").width();
  813. var widthMove = widthSpan - obj.width();
  814. obj.scrollLeft(0);
  815. obj.animate({
  816. scrollLeft: widthMove,
  817. }, time, 'linear', function() {
  818. textMoveAnimateById(domId, time);
  819. });
  820. }
  821. /**
  822. * 文本循环移动动画 适用于容器内展示span且span宽度超过div宽度
  823. * @param {string} selector 容器选择器
  824. * @param {int} time 动画时间,单位ms
  825. */
  826. function textMoveAnimateBySelector(selector, time) {
  827. var obj = $("." + selector);
  828. var widthSpan = $('.' + selector + ">span").width();
  829. console.log(widthSpan);
  830. var widthMove = widthSpan - obj.width();
  831. obj.scrollLeft(0);
  832. obj.animate({
  833. scrollLeft: widthMove,
  834. }, time, 'linear', function() {
  835. textMoveAnimateBySelector(selector, time);
  836. });
  837. }
  838. /**
  839. * 获取通过URL传递的参数
  840. * main.html?key=124
  841. * @param {string} name 关键字
  842. * @return {string} 未获取到返回null 否则返回值
  843. */
  844. function GetQueryString(name) {
  845. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  846. var r = window.location.search.substr(1).match(reg);
  847. if (r != null) return unescape(r[2]);
  848. return null;
  849. }
  850. /**
  851. * 绑定搜索框 通过绑定监听 获取查询内容
  852. * @param {string} controlID 搜索框ID
  853. * @param {function} callback 返回监听
  854. */
  855. function bindSearchControlEvent(controlID, callback) {
  856. var self = this;
  857. /**
  858. * 搜索框追加事件
  859. */
  860. document.getElementById(controlID).addEventListener('keypress', function(e) {
  861. //判断点击的是否是 搜索 按钮
  862. if (e.keyCode == 13) {
  863. var value = this.value;
  864. document.activeElement.blur();
  865. if (callback != undefined) callback(value);
  866. }
  867. });
  868. }
  869. /**
  870. * 获取dom的属性值
  871. * @param {Object} domId
  872. * @param {Object} attrName
  873. */
  874. function getAttributeValue(domId, attrName) {
  875. var value = $("#" + domId).attr(attrName);
  876. if (value == undefined) return "";
  877. else return value;
  878. }
  879. /**
  880. * 打开侧滑菜单
  881. */
  882. function openMainMenu() {
  883. mui('.mui-off-canvas-wrap').offCanvas('show');
  884. }
  885. /**
  886. * 关闭侧滑菜单
  887. */
  888. function closeMainMenu() {
  889. mui('.mui-off-canvas-wrap').offCanvas('close');
  890. }
  891. /**
  892. * 给类添加点击事件
  893. * @param {string} className 类名称
  894. */
  895. function appendClickEventByClassName(className) {
  896. $("." + className).each(function(index, element) {
  897. $("." + className)[index].addEventListener('tap', function() {
  898. muiAlert($(this).text(), '详细内容');
  899. })
  900. })
  901. }
  902. /**
  903. * 显示内容
  904. * @param {Object} obj 显示内容的容器
  905. */
  906. function showDetails(obj) {
  907. muiAlert($(obj).text(), '详细内容');
  908. }
  909. /**
  910. * 重置图表的尺寸
  911. */
  912. function echartsSizeInit() {
  913. $(".jt-count-echarts-panel .jt-content").each(function(index, element) {
  914. var echartsDom = $(".jt-count-echarts-panel .jt-content")[index];
  915. var width = $(echartsDom).width();
  916. var height = $(echartsDom).height();
  917. if (height < 10) {
  918. $(echartsDom).height(width * 3 / 4);
  919. }
  920. });
  921. }
  922. /* +++++++++++++++++地块公用+++++++++++++++++++++ */
  923. /**
  924. * 查询地块数据
  925. * @param {string} title 标题
  926. * @param {string} tabName 数据表名称
  927. * @param {string} fldName 字段名称
  928. * @param {string} fldValue 字段值
  929. * @param {string} showFldName 展示字段名称
  930. */
  931. function queryFeatures(title, tabName, fldName, fldValue, showFldName) {
  932. var iData = {
  933. tabName: tabName,
  934. fldName: fldName,
  935. fldValue: fldValue,
  936. queryType: 'equal',
  937. showFldName: showFldName === undefined ? '' : showFldName,
  938. start: '1',
  939. count: '100',
  940. }
  941. sendAjax({
  942. url: 'appQueryFeatureData',
  943. data: iData,
  944. waitMessage: '查询中...',
  945. success: function(resData) {
  946. var data = resData[0];
  947. if (data.dataCount == 0) {
  948. muiAlert('未查询到任何数据!', '警告');
  949. } else {
  950. showFeaturesResult(title, data);
  951. }
  952. },
  953. error: function(err) {
  954. muiAlertError(err);
  955. }
  956. })
  957. }
  958. /**
  959. * 地块数据展示
  960. * @param {string} title 标题
  961. * @param {JSON} jsonData 数据集
  962. */
  963. function showFeaturesResult(title, jsonData) {
  964. /* 判断容器是否存在 */
  965. var rootPanel = document.getElementById('queryResultPopover');
  966. if (rootPanel) {
  967. $(rootPanel).html('');
  968. } else {
  969. rootPanel = document.createElement('div');
  970. rootPanel.id = 'queryResultPopover';
  971. rootPanel.className = 'mui-popover mui-popover-action mui-popover-bottom jt-query-result-popover';
  972. document.body.append(rootPanel);
  973. }
  974. /* 创建标题头 */
  975. var header = document.createElement('header');
  976. header.className = 'mui-bar';
  977. header.innerHTML = "<div class='jt-popover-title'>" + title + '</div>查询结果';
  978. rootPanel.append(header);
  979. /* 创建内容容器 */
  980. var divScroll = document.createElement('div');
  981. divScroll.className = 'mui-scroll-wrapper';
  982. rootPanel.append(divScroll);
  983. /* 创建滚动子容器 */
  984. var divScrollChild = document.createElement('div');
  985. divScrollChild.className = 'mui-scroll';
  986. divScroll.append(divScrollChild);
  987. /* 创建查询结果根容器 */
  988. var divRoot = document.createElement('div');
  989. divRoot.className = 'mui-card';
  990. divScrollChild.append(divRoot);
  991. /* 加入数据 */
  992. for (var i in jsonData.dataList) {
  993. var item = jsonData.dataList[i];
  994. var divItem = document.createElement('div');
  995. if (i % 2 == 0) {
  996. divItem.className = 'jt-feature-data-row jt-row-even-number';
  997. } else {
  998. divItem.className = 'jt-feature-data-row jt-row-odd-number';
  999. }
  1000. divRoot.append(divItem);
  1001. var html = "";
  1002. html += "<span>" + item.feaNumber + "</span>";
  1003. html += "<span>" + item.feaName + "</span>";
  1004. html += "<span>" + item.feaArea + "亩</span>";
  1005. html += "<button type='button' class='mui-btn app-icon app-icon-location'";
  1006. // html += " onclick = \"toMapLocation_tabName_feaId('" + item.tabName + "','" + item.feaId +
  1007. // "','地块定位')\" />";
  1008. html += " onclick = \"CallMapLocation('" + item.tabName + "','" + item.feaId + "')\" />"
  1009. divItem.innerHTML = html;
  1010. }
  1011. /* 显示弹框 */
  1012. mui("#queryResultPopover").popover('show');
  1013. /* 重置滚动容器 该方法是必须的 否则将导致滚动容器滚动失败 */
  1014. mui('.mui-scroll-wrapper').scroll();
  1015. }
  1016. /**
  1017. * 添加水印
  1018. * @param {JSON} settings 配置项
  1019. * settings.watermarl_element{string}:你需要加水印的元素的id,例如#app
  1020. * settings.watermark_txt{string}:水印内容
  1021. */
  1022. function watermark(settings) {
  1023. //默认设置
  1024. var defaultSettings = {
  1025. watermarl_element: "body",
  1026. watermark_txt: "",
  1027. watermark_x: 20, //水印起始位置x轴坐标
  1028. watermark_y: 20, //水印起始位置Y轴坐标
  1029. watermark_rows: 2000, //水印行数
  1030. watermark_cols: 2000, //水印列数
  1031. watermark_x_space: 70, //水印x轴间隔
  1032. watermark_y_space: 30, //水印y轴间隔
  1033. watermark_color: '#aaa', //水印字体颜色
  1034. watermark_alpha: 0.3, //水印透明度
  1035. watermark_fontsize: '14px', //水印字体大小
  1036. watermark_font: '微软雅黑', //水印字体
  1037. watermark_width: 280, //水印宽度
  1038. watermark_height: 80, //水印长度
  1039. watermark_angle: 25 //水印倾斜度数
  1040. };
  1041. //采用配置项替换默认值,作用类似jquery.extend
  1042. if (arguments.length === 1 && typeof arguments[0] === "object") {
  1043. var src = arguments[0] || {};
  1044. for (let key in src) {
  1045. if (src[key] && defaultSettings[key] && src[key] === defaultSettings[key])
  1046. continue;
  1047. else if (src[key])
  1048. defaultSettings[key] = src[key];
  1049. }
  1050. }
  1051. var oTemp = document.createDocumentFragment();
  1052. var maskElement = document.getElementById(defaultSettings.watermarl_element) || document.body;
  1053. //获取页面最大宽度
  1054. var page_width = Math.max(maskElement.scrollWidth, maskElement.clientWidth);
  1055. //获取页面最大高度
  1056. var page_height = Math.max(maskElement.scrollHeight, maskElement.clientHeight);
  1057. //水印数量自适应元素区域尺寸
  1058. defaultSettings.watermark_cols = Math.ceil(page_width / (defaultSettings.watermark_x_space + defaultSettings
  1059. .watermark_width));
  1060. defaultSettings.watermark_rows = Math.ceil(page_height / (defaultSettings.watermark_y_space + defaultSettings
  1061. .watermark_height));
  1062. var x;
  1063. var y;
  1064. for (var i = 0; i < defaultSettings.watermark_rows; i++) {
  1065. y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i;
  1066. for (var j = 0; j < defaultSettings.watermark_cols; j++) {
  1067. x = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * j;
  1068. var mask_div = document.createElement('div');
  1069. mask_div.id = 'mask_div' + i + j;
  1070. mask_div.className = 'mask_div';
  1071. //mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt));
  1072. mask_div.innerHTML = (defaultSettings.watermark_txt);
  1073. //设置水印div倾斜显示
  1074. mask_div.style.webkitTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
  1075. mask_div.style.MozTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
  1076. mask_div.style.msTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
  1077. mask_div.style.OTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
  1078. mask_div.style.transform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
  1079. mask_div.style.visibility = "";
  1080. mask_div.style.position = "absolute";
  1081. mask_div.style.left = x + 'px';
  1082. mask_div.style.top = y + 'px';
  1083. mask_div.style.overflow = "hidden";
  1084. mask_div.style.zIndex = "1";
  1085. mask_div.style.pointerEvents = 'none'; //pointer-events:none 让水印不遮挡页面的点击事件
  1086. //mask_div.style.border="solid #eee 1px";          //兼容IE9以下的透明度设置 mask_div.style.filter="alpha(opacity=50)";
  1087. mask_div.style.opacity = defaultSettings.watermark_alpha;
  1088. mask_div.style.fontSize = defaultSettings.watermark_fontsize;
  1089. mask_div.style.fontFamily = defaultSettings.watermark_font;
  1090. mask_div.style.color = defaultSettings.watermark_color;
  1091. mask_div.style.textAlign = "center";
  1092. mask_div.style.width = defaultSettings.watermark_width + 'px';
  1093. mask_div.style.height = defaultSettings.watermark_height + 'px';
  1094. mask_div.style.display = "block";
  1095. oTemp.appendChild(mask_div);
  1096. };
  1097. };
  1098. maskElement.appendChild(oTemp);
  1099. }
  1100. /**
  1101. * 设置选择控件的显示内容和值
  1102. * @param {string} domId 控件Id
  1103. * @param {string} text 显示文本
  1104. * @param {string} value 内部值
  1105. */
  1106. function setSelectControlValue(domId, text, value) {
  1107. let _self = document.getElementById(domId);
  1108. $(_self).html(text);
  1109. $(_self).attr('data-value', text);
  1110. $(_self).attr('data-code', value);
  1111. }
  1112. /**
  1113. * 点击指示器事件
  1114. * @param {Object} objDom 点击的dom对象
  1115. */
  1116. function indicator(objDom) {
  1117. /* 循环所有指示器 */
  1118. $(".jt-indicator").each(function(index, element) {
  1119. element.classList.remove('jt-indicator-active');
  1120. if (!objDom && index === 0) {
  1121. element.classList.add('jt-indicator-active');
  1122. }
  1123. })
  1124. if (objDom) {
  1125. objDom.classList.add('jt-indicator-active');
  1126. }
  1127. }
  1128. /**
  1129. * 通过jQuery设置显示内容
  1130. * @param {String} domId domId
  1131. * @param {String} text 显示内容
  1132. */
  1133. function setTextByDomId(domId, text) {
  1134. $("#" + domId).text(text);
  1135. }
  1136. /**
  1137. * 通过jQuery设置显示内容
  1138. * @param {String} domId domId
  1139. * @param {String} text 显示内容
  1140. */
  1141. function setHtmlByDomId(domId, text) {
  1142. $("#" + domId).html(text);
  1143. }