Created
July 12, 2016 12:34
-
-
Save black-black-cat/aefb3aa808f12b71df33e2bcc2d5b546 to your computer and use it in GitHub Desktop.
前端工具方法
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var B = {}; | |
| B.url = {}; | |
| // 获取search 或 hash 中的参数 | |
| B.url.getParam = function(name, url) { | |
| url = url || location.href; | |
| var reg = new RegExp("(^|&|\\?|#)" + name + "=([^&]*?)(&|#|$)"); | |
| var tempHash = url.match(/#.*/) ? url.match(/#.*/)[0] : ""; | |
| url = url.replace(/#.*/, ""); | |
| if (reg.test(tempHash)) { | |
| return decodeURIComponent(tempHash.match(reg)[2]); | |
| } else if (reg.test(url)) { | |
| return decodeURIComponent(url.match(reg)[2]); | |
| } else { | |
| return ''; | |
| } | |
| }; | |
| // 时间格式化函数 author: meizz | |
| // (new Date()).format("yyyy-MM-dd hh:mm:ss.S") => 2006-07-02 08:09:04.423 | |
| // (new Date()).format("yyyy-M-d h:m:s.S") => 2006-7-2 8:9:4.18 | |
| Date.prototype.format = function(fmt) { | |
| var o = { | |
| "M+": this.getMonth() + 1, //月份 | |
| "d+": this.getDate(), //日 | |
| "h+": this.getHours(), //小时 | |
| "m+": this.getMinutes(), //分 | |
| "s+": this.getSeconds(), //秒 | |
| "q+": Math.floor((this.getMonth() + 3) / 3), //季度 | |
| "S": this.getMilliseconds() //毫秒 | |
| }; | |
| if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); | |
| for (var k in o) | |
| if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); | |
| return fmt; | |
| }; | |
| B.url.setParam = function(name, value, url, isHashMode) { | |
| if (typeof name === 'undefined' || typeof value === 'undefined' || typeof url === 'undefined') { | |
| return url; | |
| } | |
| var separator, reg = new RegExp("(^|&|\\?|#)" + name + "=([^&]*?)(&|#|$)"), | |
| tempHash = url.match(/#.*/) ? url.match(/#.*/)[0] : ""; | |
| url = url.replace(/#.*/, ''); | |
| if (isHashMode === true) { | |
| if (reg.test(tempHash)) { | |
| tempHash = tempHash.replace(reg, function(m, r1, r2, r3) { | |
| return r1 + name + "=" + encodeURIComponent(value) + r3; | |
| }); | |
| } else { | |
| separator = tempHash.indexOf("#") === -1 ? "#" : "&"; | |
| tempHash = tempHash + separator + name + "=" + encodeURIComponent(value); | |
| } | |
| tempHash = tempHash.replace(reg, function(m, r1, r2, r3) { | |
| return r1 + name + "=" + encodeURIComponent(value) + r3; | |
| }); | |
| return tempHash + url; | |
| } else if (reg.test(url)) { | |
| url = url.replace(reg, function(m, r1, r2, r3) { | |
| return r1 + name + "=" + encodeURIComponent(value) + r3; | |
| }); | |
| } else { | |
| separator = url.indexOf("?") === -1 ? "?" : "&"; | |
| url = url + separator + name + "=" + encodeURIComponent(value); | |
| } | |
| return url + tempHash; | |
| }; | |
| B.url.parseHash = function(hash) { | |
| var tag, query, param = {}; | |
| var arr = hash.split('?'); | |
| tag = arr[0]; | |
| if (arr.length > 1) { | |
| var seg, s; | |
| query = arr[1]; | |
| seg = query.split('&'); | |
| for (var i = 0; i < seg.length; i++) { | |
| if (!seg[i]) continue; | |
| s = seg[i].split('='); | |
| param[s[0]] = s[1]; | |
| } | |
| } | |
| return { | |
| hash: hash, | |
| tag: tag, | |
| query: query, | |
| param: param | |
| }; | |
| }; | |
| B.url.serializeArray = function(params) { | |
| var param = {}, temp; | |
| try { | |
| params = params.split('&'); | |
| for (var i = 0, len = params.length; i < len; i++) { | |
| if (!params[i]) continue; | |
| temp = params[i].split('='); | |
| param[temp[0]] = temp[1]; | |
| } | |
| } catch(err) { | |
| alert('解析公用参数出错:' + err); | |
| } | |
| return param; | |
| }; | |
| // 将 url 中的参数全部提取到一个对象中并返回 | |
| B.url.getObj = function(url) { | |
| var obj = B.url.parseHash(url); | |
| return obj.param; | |
| }; | |
| B.url.setObj = function(url, obj) { | |
| $.each(obj, function(key, value) { | |
| url = B.url.setParam(key, value, url); | |
| }); | |
| return url; | |
| }; | |
| B.user = {}; | |
| B.user.isLogin = function() { | |
| // var auth = ddb.pgps('chartered_bus_payEndAuth'); | |
| // var isChartered = ddb.fileName === 'chartered_bus.html'; | |
| // if (isChartered && auth == 1) { | |
| // return true; | |
| // } | |
| return !!(ddb.cookie('wx_user_id') && ddb.cookie('wx_mobile') && ddb.cookie('wx_device_id')); | |
| }; | |
| // 两个可选参数:登录返回地址(地址必须为完整地址);是否使用替换模式 | |
| B.user.login = function(referrer, replace) { | |
| // 没有指定返回地址就用替换方式 | |
| if (typeof replace === 'undefined') { | |
| replace = ddb.isWeixin || !referrer; | |
| } | |
| referrer = encodeURIComponent(referrer || location.href); | |
| var url = 'http://' + ddb.host + '/webapp/login.html?referrer=' + referrer; | |
| if (replace) { | |
| location.replace(url); | |
| } else { | |
| location.href = url; | |
| } | |
| }; | |
| // 清除登录缓存 | |
| B.user.clearLogin = function(callback) { | |
| if (ddb.isIosApp && !callback) { | |
| return; | |
| } | |
| ddb.cookie('wx_user_id', '', {path: '/'}); | |
| ddb.cookie('wx_mobile', '', {path: '/'}); | |
| ddb.cookie('wx_device_id', '', {path: '/'}); | |
| ddb.cookie('wx_ddb_token', '', {path: '/'}); | |
| ddb.cookie('wx_login_token', '', {path: '/'}); | |
| ddb.cookie('wx_user_open_id', '', {path: '/'}); | |
| // 清除旧登录缓存 | |
| ddb.cookie('wx_device_id', ''); | |
| ddb.cookie('wx_mobile', ''); | |
| ddb.cookie('wx_user_id', ''); | |
| ddb.cookie('wx_ddb_token', ''); | |
| ddb.cookie('wx_login_token', ''); | |
| ddb.cookie('wx_user_open_id', ''); | |
| // 清除 sessionStorage 缓存 | |
| sessionStorage.clear(); | |
| // 清除 app 公用数据缓存 | |
| ddb.session('appCommon', null); | |
| // 返回我的页面并重新获取 openid | |
| // ddb.getOpenId('http://' + ddb.host + '/webapp/mine.html', ddb.isWeixin); | |
| // location = referrer || '../login.html'; | |
| if (typeof callback === 'function') { | |
| callback(); | |
| } else { | |
| location.reload(); | |
| } | |
| }; | |
| B.user.logout = function(callapi, callback) { | |
| callback = callback || B.user.login; | |
| if (callapi) { | |
| var url = ddb.isWeixin ? '/app/userLoginOut/' : 'authentication/logout'; | |
| var postData = ddb.isWeixin ? {urlType: 'app'} : {}; | |
| ddb.get(url, postData, function(d) { | |
| if (+d.ret === 0) { | |
| B.user.clearLogin(callback); | |
| } else { | |
| ddb.msg(d.msg); | |
| } | |
| }).fail(function() { | |
| alert('服务器错误'); | |
| }); | |
| } else { | |
| B.user.clearLogin(callback); | |
| } | |
| }; | |
| var ddb = {}; | |
| ddb.version = '2.6.0'; | |
| // 判断是否在微信中 | |
| ddb.isWeixin = /MicroMessenger/i.test(navigator.userAgent); | |
| ddb.isApp = /DaDaBusPassenger/i.test(navigator.userAgent); | |
| // ddb.android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); | |
| ddb.isAndroidApp = ddb.isApp && $.os.android; | |
| ddb.isIosApp = ddb.isApp && $.os.ios; | |
| // ddb.env = 'release'; // 正式环境 | |
| // ddb.env = 'pre'; // 预发布环境 | |
| // ddb.env = 'test'; // 测试环境 | |
| // ddb.env = 'dev'; // 本地调试 | |
| // 根据二级域名判断开发环境 | |
| // PS. 此方法无法判定预发布环境,需要设置 host 来解决 | |
| ddb.dev_status = 'release'; | |
| ddb.appid = 'wx72a2b17c7ed41fe8'; | |
| switch (location.hostname.split('.')[0]) { | |
| case 'loc': | |
| case 'dev': | |
| ddb.dev_status = 'dev'; | |
| ddb.appid = 'wx108854b0f729a8e5'; | |
| break; | |
| case 'test': | |
| ddb.dev_status = 'test'; | |
| ddb.appid = 'wx54125ac4cf97185c'; | |
| break; | |
| case 'pre': | |
| ddb.dev_status = 'pre'; | |
| ddb.appid = 'wx72a2b17c7ed41fe8'; | |
| break; | |
| // case 'static': | |
| // default: | |
| // ddb.dev_status = 'release'; | |
| // ddb.appid = 'wx72a2b17c7ed41fe8'; | |
| } | |
| ddb.sld = ddb.dev_status === 'release' ? '' : ddb.dev_status + '.'; // 二级域名(带.) | |
| ddb.host = location.host.replace('static.', ''); | |
| // ddb.api = 'http://' + (ddb.dev_status === 'release' ? '' : 'test.') + 'api.buskeji.com/'; // 若开发接口抽风,可暂用测试接口 | |
| ddb.api = 'http://' + ddb.sld + 'api.buskeji.com/'; | |
| // 因微信安全域名限制正式公众号下只有 wechat.buskeji.com 域名有授权回调权限 | |
| // ddb.wxapi = ddb.dev_status === 'release' ? 'http://wechat.buskeji.com/app/api?parames=' : '/app/api?parames='; | |
| ddb.wxapi = 'http://' + ddb.host + '/app/api?parames='; | |
| // ddb.appid = 'wx72a2b17c7ed41fe8'; // 微信公众号 appid | |
| ddb.appkey = ddb.dev_status === 'release' ? 'uwd1c0sxd3621' : 'pvxdm17jx8rqr'; // 融云 APPKEY | |
| // ddb.debugMobile = '137xxx'; | |
| ddb.xhrs = []; | |
| ddb.noop = function() {}; | |
| // 保持下发地址域名境与当前域名环境一致 | |
| ddb.fitEnv = function(url) { | |
| if (ddb.dev_status === 'release') { | |
| return url; | |
| } else { | |
| return url.replace(/\/\/(dev|test)\./, '//' + location.hostname.split('.')[0] + '.'); | |
| } | |
| }; | |
| (function() { | |
| // ajax 请求时初始化通用参数 | |
| function initCommon() { | |
| var mobile = ddb.cookie('wx_mobile'); | |
| var gps = ddb.pgps('ddb_user_gps'); | |
| var cityCode = (ddb.store('ddbCity') || '').split('/')[1]; | |
| var ddbSrcId = ddb.session('ddb_src_id'); | |
| // 用户信息已改变,从缓存中重置 | |
| if (mobile && mobile !== ddb.common.mobile) { | |
| ddb.common.mobile = mobile; | |
| ddb.common.user_id = ddb.cookie('wx_user_id'); | |
| ddb.common.device_id = ddb.cookie('wx_device_id'); | |
| ddb.common.ddb_token = ddb.cookie('wx_ddb_token'); | |
| // 兼容旧版微信 | |
| if (!ddb.common.ddb_token) { | |
| ddb.common.login_token = ddb.cookie('wx_login_token'); | |
| } | |
| } | |
| // 用户地理经纬度 | |
| if (gps) { | |
| ddb.common.lng = gps.lng; | |
| ddb.common.lat = gps.lat; | |
| ddb.common.gps_sampling_time = gps.gps_sampling_time; | |
| } | |
| // 城市编码 | |
| if (cityCode) { | |
| ddb.common.city_code = cityCode; | |
| } | |
| // 渠道号 | |
| // console.log('ddb_src_id: ', ddbSrcId); | |
| if (ddbSrcId) { | |
| ddb.common.ddb_src_id = ddbSrcId; | |
| } | |
| // 时间戳 | |
| // ddb.common.cache_time = Math.random(); | |
| // console.log('commondata: ', ddb.common); | |
| } | |
| function ddbAjax(opts) { | |
| initCommon(); | |
| opts.data = $.extend({}, ddb.common, opts.data || {}); | |
| // 如果不是完整路径 | |
| if (!/^https?:/i.test(opts.url)) { | |
| opts.url = opts.urlType === 'app' ? opts.url : ddb.api + opts.url; | |
| } | |
| var cache = opts.cachekey ? ddb.session(opts.cachekey) : null; | |
| var dtd = $.Deferred(); | |
| var xhr; | |
| function process(d) { | |
| if ((+d.ret === 8001 || +d.ret === 8002 || +d.ret === 8003)) { | |
| if (opts.notCheckLogin) { | |
| B.user.clearLogin(); | |
| dtd.reject(d); | |
| return; | |
| } | |
| // 清除登录态 | |
| if (B.user.isLogin()) { | |
| B.user.logout(); | |
| return; | |
| } | |
| // 转到登陆页 | |
| B.user.login(); | |
| return; | |
| } | |
| // 获取 openid | |
| if (+d.ret === 6001) { | |
| if (ddb.isWeixin && !opts.notCheckLogin) { | |
| ddb.getOpenId(0, true); | |
| } | |
| dtd.reject(d); | |
| return; | |
| } | |
| dtd.resolve(d); | |
| } | |
| if (cache) { | |
| process(cache); | |
| return dtd.promise(); | |
| } | |
| if (!opts.noLoading) { | |
| ddb.loading.show(); | |
| } | |
| xhr = $.ajax({ | |
| type: opts.type || 'GET', | |
| url: opts.url, | |
| data: opts.data, | |
| dataType: opts.dataType || 'json', | |
| cache: opts.cache || false, | |
| timeout: 15000, | |
| success: function(d, status, xhr) { | |
| ddb.loading.hide(); | |
| process(d); | |
| console.log('AJAX: ' + opts.url + '\n ', d); | |
| // 缓存数据 | |
| if (opts.cachekey) { | |
| ddb.session(opts.cachekey, d); | |
| } | |
| }, | |
| error: function(msg, type) { | |
| ddb.loading.hide(); | |
| console.log('网络异常[' + type + ']'); | |
| dtd.reject(msg); | |
| } | |
| }); | |
| ddb.xhrs.push(xhr); | |
| if (opts.returnXhr) { | |
| return xhr; | |
| } | |
| return dtd.promise(); | |
| } | |
| function DdbGet(url, postData, callback, err) { | |
| // 如果无 postData | |
| if (typeof postData === 'function') { | |
| callback = postData; | |
| err = callback; | |
| postData = {}; | |
| } | |
| initCommon(); | |
| postData = $.extend({}, ddb.common, postData || {}); | |
| var dtd = $.Deferred(); | |
| var cachekey = postData.cachekey; | |
| var cache = cachekey ? ddb.session(cachekey) : null; | |
| var xhr; | |
| // 如果不是完整路径 | |
| if (!/^https?:/i.test(url)) { | |
| url = postData.urlType === 'app' ? url : ddb.api + url; | |
| } | |
| function process(d) { | |
| // 服务器返回未登录状态码 | |
| if ((+d.ret === 8001 || +d.ret === 8002 || +d.ret === 8003)) { | |
| // 不检测登录态 | |
| if (postData.notCheckLogin) { | |
| B.user.clearLogin(); | |
| dtd.reject(d); | |
| return; | |
| } | |
| // 如果本地有登录态,则退出并清除登录态 | |
| if (B.user.isLogin()) { | |
| B.user.logout(); | |
| return; | |
| } | |
| // 跳到登陆页面 | |
| B.user.login(); | |
| return; | |
| } | |
| // 未关注公众号 | |
| if (+d.ret === 6001) { | |
| if (ddb.isWeixin && !postData.notCheckLogin) { | |
| ddb.getOpenId(0, true); | |
| } | |
| dtd.reject(d); | |
| return; | |
| } | |
| if (typeof callback === 'function') { | |
| callback(d); | |
| } | |
| dtd.resolve(d); | |
| } | |
| // 如果有缓存 | |
| if (cache) { | |
| // console.log('Cached: ', !!cache); | |
| process(cache); | |
| return dtd.promise(); | |
| } | |
| if (!postData.noLoading) { | |
| ddb.loading.show(); | |
| } | |
| xhr = $.ajax({ | |
| url: url, | |
| type: 'GET', | |
| data: postData, | |
| dataType: postData.dataType || 'json', | |
| cache: postData.cache || false, | |
| timeout: 15000, | |
| success: function(d, status, xhr) { | |
| ddb.loading.hide(); | |
| console.log('GET: ' + url + '\n ', d); | |
| // 缓存数据 | |
| if (cachekey) { | |
| ddb.session(cachekey, d); | |
| } | |
| process(d); | |
| }, | |
| // type: timeout, error, abort, parsererror | |
| error: function(msg, type) { | |
| // console.log('msg: ', msg); | |
| // console.log('type: ', type); | |
| ddb.loading.hide(); | |
| if (typeof err === 'function') { | |
| err(msg, type); | |
| } | |
| console.log('网络异常[' + type + ']'); | |
| dtd.reject(msg); | |
| } | |
| }); | |
| ddb.xhrs.push(xhr); | |
| // console.log(ddb.xhrs); | |
| if (postData.returnXhr) { | |
| return xhr; | |
| } | |
| return dtd.promise(); | |
| } | |
| function DdbPost(url, postData, callback, err) { | |
| initCommon(); | |
| postData = $.extend({}, ddb.common, postData || {}); | |
| // 如果不是完整路径 | |
| if (!/^https?:/i.test(url)) { | |
| url = postData.urlType === 'app' ? url : ddb.api + url; | |
| } | |
| var dtd = $.Deferred(); | |
| var cachekey = postData.cachekey; | |
| var cache = cachekey ? ddb.session(cachekey) : null; | |
| var xhr; | |
| function process(d) { | |
| // 服务器返回未登录状态码 | |
| if ((+d.ret === 8001 || +d.ret === 8002 || +d.ret === 8003)) { | |
| // 如果本地有登录态,则退出并清除登录态 | |
| if (B.user.isLogin()) { | |
| B.user.logout(); | |
| return; | |
| } | |
| // 跳到登陆页面 | |
| B.user.login(); | |
| return; | |
| } | |
| if (typeof callback === 'function') { | |
| callback(d); | |
| } | |
| dtd.resolve(d); | |
| } | |
| // 如果有缓存 | |
| if (cache) { | |
| // console.log('Cached: ', !!cache); | |
| process(cache); | |
| return dtd.promise(); | |
| } | |
| if (!postData.noLoading) { | |
| ddb.loading.show(); | |
| } | |
| xhr = $.ajax({ | |
| url: url, | |
| type: 'POST', | |
| data: postData, | |
| dataType: postData.dataType || 'json', | |
| cache: postData.cache || false, | |
| timeout: 15000, | |
| success: function(d) { | |
| ddb.loading.hide(); | |
| console.log('POST: ' + url + '\n ', d); | |
| // 缓存数据 | |
| if (cachekey) { | |
| ddb.session(cachekey, d); | |
| } | |
| process(d); | |
| }, | |
| error: function(msg, type) { | |
| ddb.loading.hide(); | |
| if (typeof err === 'function') { | |
| err(msg, type); | |
| } | |
| console.log('网络异常[' + type + ']'); | |
| dtd.reject(); | |
| } | |
| }); | |
| ddb.xhrs.push(xhr); | |
| return dtd.promise(); | |
| } | |
| function upload(url, postData, callback, err) { | |
| var fd = new FormData(); | |
| url = ddb.api + url; | |
| initCommon(); | |
| postData = $.extend({}, ddb.common, postData); | |
| // 把 common 值添加到 formData 对象 | |
| for (var key in postData) { | |
| if (postData.hasOwnProperty(key) && key !== 'hasOwnProperty') { | |
| if (postData[key].name) { | |
| fd.append(key, postData[key], postData[key].name); | |
| } else { | |
| fd.append(key, postData[key]); | |
| } | |
| } | |
| } | |
| // fd.append('image', postData.file, postData.file.name); | |
| ddb.loading.show(); | |
| $.ajax({ | |
| url: url, | |
| dataType: 'json', | |
| type: 'POST', | |
| data: fd, | |
| timeout: 30000, | |
| cache: false, // 上传文件不需要缓存 | |
| processData: false, // data是FormData对象,不需要对数据做处理 | |
| contentType: false, | |
| // contentType: 'multipart/form-data', | |
| success: function(d) { | |
| ddb.loading.hide(); | |
| onsuccess(d); | |
| console.log('UPLOAD: ' + url + '\n ', d); | |
| }, | |
| error: function(msg, type) { | |
| ddb.loading.hide(); | |
| if (typeof err === 'function') { | |
| err(msg, type); | |
| } | |
| console.log('上传出错[' + type + ']'); | |
| } | |
| }); | |
| function onsuccess(d) { | |
| // 如果服务器返回未登录 | |
| if (+d.ret === 8001 || +d.ret === 8002 || +d.ret === 8003) { | |
| // 若本地有登录缓存,清除登录缓存并转到登录页 | |
| if (B.user.isLogin()) { | |
| B.user.logout(); | |
| return; | |
| } | |
| // 跳转到登陆页面 | |
| B.user.login(); | |
| return; | |
| } | |
| callback(d); | |
| } | |
| } | |
| function DdbGetJsonp(url, postData, callback, err) { | |
| // 如果无 postData | |
| if (typeof postData === 'function') { | |
| callback = postData; | |
| err = callback; | |
| postData = {}; | |
| } | |
| initCommon(); | |
| postData = $.extend({}, ddb.common, postData || {}); | |
| var dtd = $.Deferred(); | |
| var cachekey = postData.cachekey; | |
| var cache = cachekey ? ddb.session(cachekey) : null; | |
| var xhr; | |
| // 如果不是完整路径 | |
| if (!/^https?:/i.test(url)) { | |
| url = postData.urlType === 'app' ? url : ddb.api + url; | |
| } | |
| function process(d) { | |
| if (typeof callback === 'function') { | |
| callback(d); | |
| } | |
| dtd.resolve(d); | |
| } | |
| // 如果有缓存 | |
| if (cache) { | |
| process(cache); | |
| return dtd.promise(); | |
| } | |
| if (!postData.noLoading) { | |
| ddb.loading.show(); | |
| } | |
| xhr = $.ajax({ | |
| url: url, | |
| type: 'GET', | |
| data: postData, | |
| dataType: 'jsonp', | |
| cache: postData.cache || false, | |
| jsonp: 'cb', | |
| // jsonpCallback: 'success_jsonpCallback', | |
| timeout: 15000, | |
| success: function(d) { | |
| ddb.loading.hide(); | |
| console.log(d); | |
| // 缓存数据 | |
| if (cachekey) { | |
| ddb.session(cachekey, d); | |
| } | |
| process(d); | |
| console.log('JSONP: ' + url + '\n ', d); | |
| }, | |
| error: function(msg, type) { | |
| ddb.loading.hide(); | |
| if (typeof err === 'function') { | |
| err(msg, type); | |
| } | |
| console.log('网络异常:', msg); | |
| dtd.reject(msg); | |
| } | |
| }); | |
| ddb.xhrs.push(xhr); | |
| return dtd.promise(); | |
| } | |
| // 登陆成功以后,需要跳转到后台控制器去设置 session 等 | |
| function getOpenId(retUrl, isWeixin) { | |
| var ciUrl = 'http://' + ddb.host + '/wechat_menu/getOpenId?'; | |
| // var ciUrl = 'http://' + location.host.replace(/^\w+\.wechat/, 'wechat') + '/wechat_menu/getOpenId?'; | |
| var url = ''; | |
| ciUrl = B.url.setParam('referrerSrc', retUrl ? retUrl : location.href, ciUrl); | |
| // retUrl = retUrl || location.href; | |
| // retUrl = retUrl.replace(/\/\/\w+\.wechat/, '//wechat'); | |
| // ciUrl = B.url.setParam('referrerSrc', retUrl, ciUrl); | |
| isWeixin = typeof isWeixin === 'undefined' ? ddb.isWeixin : isWeixin; | |
| if (isWeixin) { | |
| var wxUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?'; | |
| url = B.url.setObj(wxUrl, { | |
| appid: ddb.appid, | |
| redirect_uri: ciUrl, | |
| response_type: 'code', | |
| scope: 'snsapi_base' | |
| }); | |
| url += '#wechat_redirect'; | |
| } else { | |
| url = ciUrl; | |
| } | |
| if (!B.url.getParam('hasOpenid')) { | |
| location.replace(url); | |
| } | |
| } | |
| function Cookie(name, value, options) { | |
| options = options || {}; | |
| if (typeof value === 'undefined') { | |
| return getCookie(name); | |
| // } else if (value === null) { | |
| } else if (value === null || value === '') { | |
| return clearCookie(name, options); | |
| } else { | |
| return setCookie(name, value, options); | |
| } | |
| function setCookie(name, value, options) { | |
| var expires = options.expires; | |
| var path = options.path; | |
| var domain = options.domain; | |
| var secure = options.secure; | |
| // 缓存时间转为日期对象 | |
| if (typeof expires === 'number') { | |
| // expires = new Date(new Date().getTime() + expires * 1000 * 60 * 60); // 缓存时间单位:小时 | |
| // expires = new Date(new Date().getTime() + expires * 1000 * 60 * 60 * 24); // 缓存时间单位:天 | |
| expires = new Date(new Date().getTime() + expires * 864e+5); // 缓存时间单位:天 | |
| } | |
| // if (typeof expires === 'number') { | |
| // expires = new Date(); | |
| // expires.setDate(expires.getDate() + options.expires); // 缓存时间单位:天 | |
| // } | |
| // document.cookie = name + '=' + escape(value) + ((expires) ? '; expires=' + expires.toGMTString() : '') + ((path) ? '; path=' + path : '; path=/') + ((domain) ? ';domain=' + domain : ''); | |
| document.cookie = | |
| name + '=' + escape(value) + | |
| (expires ? '; expires=' + expires.toUTCString() : '') + | |
| (path ? '; path=' + path : '') + | |
| (domain ? '; domain=' + domain : '') + | |
| (secure ? '; secure' : ''); | |
| return true; | |
| } | |
| function getCookie(name) { | |
| var arr = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)')); | |
| if (arr !== null) { | |
| return unescape(arr[2]); | |
| } | |
| // return null; | |
| return ''; | |
| } | |
| function clearCookie(name, options) { | |
| // document.cookie = | |
| // name + '=' + | |
| // (options.path ? '; path=' + options.path : '') + | |
| // (options.domain ? '; domain=' + options.domain : '') + | |
| // '; expires=Fri, 02-Jan-1970 00:00:00 GMT'; | |
| options.expires = new Date(0); | |
| return setCookie(name, '', options); | |
| } | |
| } | |
| function jump(page, url, replaceState) { | |
| url = url || 'http://' + ddb.host + '/webapp/' + page; | |
| if (replaceState) { | |
| window.history.replaceState(history.state, '', url); | |
| } | |
| location = url; | |
| } | |
| // 数据存储(注意此方式存储经过了 JSON 解析,会还原原数据类型) | |
| function storage(type, key, val) { | |
| // 如果不支持本地缓存,很可能是启用了『无痕模式』 | |
| // if (!window[type]) { | |
| // alert('为了能享受更好的服务,请关闭浏览器的无痕模式!'); | |
| // return; | |
| // } | |
| // 不支持/无痕模式/禁用了缓存(safari 禁用缓存会报 SecurityError: Dom Exception 18) | |
| try { | |
| window[type].setItem('test', 'test'); | |
| window[type].removeItem('test'); | |
| } catch (err) { | |
| // alert(err); | |
| alert('您开启了无痕模式或禁用了缓存,为了能享受更好的服务,请更改您的设置。'); | |
| return; | |
| } | |
| if (typeof val === 'undefined') { // 读取 | |
| try { | |
| return JSON.parse(window[type].getItem(key)); | |
| } catch (r) { | |
| return window[type].getItem(key); | |
| } | |
| } else if (val === null || val === '') { // 删除 | |
| return window[type].removeItem(key); | |
| } else { // 写入 | |
| // 当本地存储满了,再往里面写数据,将会触发 error | |
| // return window[type].setItem(key, JSON.stringify(val)); | |
| try { | |
| return window[type].setItem(key, JSON.stringify(val)); | |
| } catch (e) { | |
| if (type === 'sessionStorage') { | |
| ddb.removeStoragesByKeyContains('/', type); // 删除接口的缓存 | |
| } else { | |
| ddb.removeStoragesBut('ddbCity|isAward|ddbSearch|chartered_bus_hasin|travel_city_code|waitBusTips|common_address_' + ddb.common.user_id, type); | |
| } | |
| return window[type].setItem(key, JSON.stringify(val)); | |
| } | |
| } | |
| } | |
| // 本地存储-localStorage | |
| function store(key, val) { | |
| return storage('localStorage', key, val); | |
| } | |
| // 本地存储-sessionStorage,可用于页面间传参 | |
| function session(key, val) { | |
| return storage('sessionStorage', key, val); | |
| } | |
| // 删除 key 值中包含所给字符的缓存 | |
| function removeStoragesByKeyContains(str, type) { | |
| var storage = window[type || 'sessionStorage']; | |
| var len = storage.length; | |
| var key; | |
| // 如果不支持本地缓存,很可能是启用了『无痕模式』 | |
| if (!storage) { | |
| alert('为了能享受更好的服务,请关闭浏览器的无痕模式!'); | |
| return; | |
| } | |
| // for (var i = 0; i < sessionStorage.length; i++) { | |
| // if (sessionStorage.key(i).indexOf(val) !== -1) { | |
| // sessionStorage.removeItem(sessionStorage.key(i)); | |
| // i--; | |
| // } | |
| // } | |
| while (len) { | |
| len--; | |
| key = storage.key(len); | |
| if (key.indexOf(str) !== -1) { | |
| storage.removeItem(key); | |
| } | |
| } | |
| } | |
| // 删除除了所给 key 值的缓存,参数格式:'key1|key2|key3' | |
| function removeStoragesBut(keys, type) { | |
| keys = keys.split('|'); | |
| var storage = window[type || 'localStorage']; | |
| var len = storage.length; | |
| var key; | |
| // 如果不支持本地缓存,很可能是启用了『无痕模式』 | |
| if (!storage) { | |
| alert('为了能享受更好的服务,请关闭浏览器的无痕模式!'); | |
| return; | |
| } | |
| // keys.forEach(function(key) { | |
| // storage.removeItem(key); | |
| // }); | |
| while (len) { | |
| len--; | |
| key = storage.key(len); | |
| if (keys.indexOf(key) === -1) { | |
| // console.log('del key: ', key); | |
| storage.removeItem(key); | |
| } | |
| } | |
| } | |
| // 微信上调试弹出信息,正式版或非调试手机号不执行 | |
| function showDebug(d) { | |
| if (ddb.dev_status === 'release' && ddb.debugMobile !== ddb.cookie('wx_mobile')) { | |
| return; | |
| } | |
| // oAlert('Debug:\n' + JSON.stringify(d)); | |
| console.log('Debug: ', d); | |
| } | |
| // 支付成功显示提示信息 | |
| function payCallback(status, orderData, done, fail) { | |
| // var isCharteredBus = location.pathname.indexOf('chartered_bus.html') !== -1; // 包车订单 | |
| var isTravel = +B.url.getParam('is_travel') || orderData.line_type == 4; // 周边游订单 | |
| // var isKuaiba = orderData.line_type == 7; // 快吧订单 | |
| var orderNumber = orderData.order_number; | |
| // var jumpUrl = B.url.setParam('order_number', orderNumber, 'order_details.html'); | |
| // if (orderData.isCharteredBus) { | |
| // jumpUrl = B.url.setParam('order_id', orderNumber, 'chartered_bus.html#page-order-details'); | |
| // } | |
| // var jumpUrl = B.url.setObj('order_details.html', { | |
| // order_number: orderNumber, | |
| // pay_status: status, | |
| // line_type: orderData.line_type | |
| // }); | |
| var jumpUrl = ''; | |
| if (orderData.isCharteredBus) { | |
| jumpUrl = B.url.setParam('order_id', orderNumber, 'chartered_bus.html'); | |
| var use_native_page = B.url.getParam("use_native_page"); | |
| if(use_native_page){ | |
| jumpUrl = B.url.setParam('use_native_page',use_native_page,jumpUrl); | |
| } | |
| } else { | |
| jumpUrl = B.url.setParam('order_number', orderNumber, 'order_details.html'); | |
| } | |
| jumpUrl = B.url.setObj(jumpUrl, { | |
| pay_status: status, | |
| line_type: orderData.line_type | |
| }); | |
| if (isTravel) { | |
| jumpUrl = B.url.setParam('is_travel', 1, jumpUrl + '#page-per'); | |
| } | |
| // 如果没有提供回调则赋值空函数... | |
| done = done || ddb.noop; | |
| fail = fail || done; | |
| switch (status) { | |
| case 'ok': // 支付成功 | |
| setTimeout(payOk, 1500); // 延迟 0.5 秒请求,避免状态不同步 | |
| return; | |
| case 'cancel': // 取消 | |
| case 'fail': | |
| payFail(); | |
| return; | |
| } | |
| // 支付成功调用 | |
| function payOk() { | |
| var url = 'order/pay_confirm'; | |
| var postData = { | |
| order_number: orderNumber, | |
| dada_flag: 1 | |
| }; | |
| // 包车订单 | |
| if (orderData.isCharteredBus) { | |
| url = 'chartered/pay_confirm'; | |
| postData = { | |
| auth:ddb.pgps("chartered_bus_payEndAuth") || 0, | |
| order_id: orderNumber | |
| }; | |
| // postData = {order_id: orderNumber, | |
| // payment_id:orderData.pay_order_info.payment_id | |
| // }; | |
| } | |
| ddb.get(url, postData, function(d) { | |
| if (+d.ret !== 0) { | |
| alert(d.msg); | |
| return; | |
| } | |
| // 订单支付状态 | |
| switch (d.data.status) { | |
| case 'success': // 订单支付确认成功 | |
| onSuccess(d.data); | |
| return; | |
| case 'error invalid_order_number': | |
| alert('订单号错误'); | |
| break; | |
| case 'order_unpaid': | |
| alert('订单未支付'); | |
| break; | |
| case 'order_has_been_canceled': | |
| alert('订单已取消'); | |
| break; | |
| case 'failed': | |
| alert('其他错误'); | |
| break; | |
| } | |
| // 订单支付确认失败 | |
| jumpUrl = B.url.setParam('pay_status', 'fail', jumpUrl); | |
| payFail(); | |
| // 支付成功状态回调 | |
| function onSuccess(data) { | |
| // 缓存奖励数据 | |
| if (!ddb.store('isAward')) { | |
| ddb.pgps('award', $.extend(ddb.pgps('award') || {}, { | |
| 'show_award': data.show_award, | |
| 'award_title': data.award_title, | |
| 'award_msg': data.award_msg | |
| })); | |
| ddb.store('isAward', 1); | |
| } | |
| // 缓存活动信息 | |
| ddb.pgps('activeInfo', { | |
| show_active: data.show_active, // 1-显示 0-不显示 | |
| active_title: data.active_title, | |
| share_type: data.share_type // 分享类型: 3-邀请有礼 5-订单支付分享红包 | |
| }); | |
| // 清除首页推荐线路缓存 | |
| if (!orderData.isCharteredBus) { | |
| ddb.removeStoragesByKeyContains('intercity/get_recommend_set?line_type='); | |
| ddb.pgps('line/get_member_recommend_lines',null); | |
| } | |
| done(orderNumber); | |
| // 包车订单,在回调里弹框,然后转到订单详情页 | |
| // if (orderData.isCharteredBus) { | |
| // return; | |
| // } | |
| // 非包车订单跳到支付成功页 | |
| if (!orderData.isCharteredBus) { | |
| jumpUrl = ddb.fitEnv(data.success_url) || jumpUrl; | |
| } | |
| location.href = jumpUrl; | |
| } | |
| }); | |
| } | |
| // 支付失败调用 | |
| function payFail() { | |
| fail(orderNumber); | |
| // 包车订单,在回调里弹框,然后转到订单详情页 | |
| if (orderData.isCharteredBus) { | |
| location = '#page-order-details'; | |
| return; | |
| } | |
| location.href = jumpUrl; | |
| } | |
| } | |
| function payOrder(orderData, done, fail) { | |
| if (!orderData.order_number) { | |
| alert('订单号无效 T_T'); | |
| return; | |
| } | |
| var url = '/app/weixinOerderPay/'; | |
| var orderNumber = orderData.order_number; | |
| // var isCharteredBus = location.pathname.indexOf('chartered_bus.html') !== -1; // 包车订单 | |
| // var isTravel = +B.url.getParam('is_travel') || orderData.line_type == 4; // 周边游订单 | |
| // 如果没有提供回调则赋值空函数... | |
| done = done || ddb.noop; | |
| fail = fail || done; | |
| // 根据支付方式调取支付 | |
| switch (+orderData.pay_type) { | |
| case 1: // 微信支付 | |
| setTimeout(wxPay, 1500); | |
| break; | |
| case 2: // 支付宝支付 | |
| appPay(2); | |
| break; | |
| case 4: // 支付宝网页支付 | |
| aliWebPay(); | |
| break; | |
| case 8: // 分期乐支付 | |
| // 用 cookie 传参到订单详情页-分期乐支付回调不能带参数 | |
| ddb.cookie('fqlpay_order_number', orderNumber, {expires: 1}); | |
| location = orderData.pay_order_info.fenqile_url; | |
| break; | |
| } | |
| // app 微信/支付宝支付 | |
| function appPay(type) { | |
| if (type === 1) { // 微信支付 | |
| orderData.payChannel = 'wxpay'; | |
| orderData.payInfo = orderData.pay_order_info.wx_prepay_id; | |
| } else if (type === 2) { // 支付宝支付 | |
| orderData.payChannel = 'alipay'; | |
| orderData.payInfo = orderData.pay_order_info.alipay_params; | |
| } | |
| // 调用 app 支付接口 | |
| // ddb.app.pay(orderData.payChannel, orderData.payInfo); | |
| ddb.appCall('pay', orderData.payChannel, orderData.payInfo); | |
| ddb.Popup.confirm({ | |
| title: '支付提醒', | |
| content: '是否已经完成支付', | |
| cancelText: '遇到问题', | |
| okText: '完成支付', | |
| okCall: function() { | |
| payCallback('ok', orderData, done, fail); | |
| }, | |
| cancelCall: function() { | |
| payCallback('fail', orderData, done, fail); | |
| } | |
| }); | |
| } | |
| // 调起微信支付 | |
| function wxPay() { | |
| if (ddb.isWeixin) { // 微信中使用微信支付(正式公众号) | |
| // 如果在非正式公众号域名下支付,给予提示 | |
| if (ddb.dev_status !== 'release') { | |
| alert('测试公众号不支持微信支付'); | |
| return; | |
| } | |
| // 接口有返回支付包 | |
| if (orderData.pay_order_info && orderData.pay_order_info.wx_params) { | |
| var payPackage = orderData.pay_order_info.wx_params; | |
| // oAlert(JSON.stringify(payPackage)); | |
| payPackage = { | |
| "appId": payPackage.appid, | |
| "timeStamp": payPackage.time_stamp.toString(), | |
| "nonceStr": payPackage.nonce_str, | |
| "package": "prepay_id=" + payPackage.prepay_id, | |
| "signType": payPackage.sign_type, | |
| "paySign": payPackage.sign | |
| }; | |
| //oAlert(JSON.stringify(payPackage)); | |
| WeixinJSBridge.invoke('getBrandWCPayRequest', payPackage, function(res) { | |
| // oAlert(res.err_msg); | |
| if (res.err_msg === 'get_brand_wcpay_request:ok') { // 支付成功 | |
| payCallback('ok', orderData, done, fail); | |
| } else if (res.err_msg === 'get_brand_wcpay_request:cancel') { // 取消支付 | |
| payCallback('cancel', orderData, done, fail); | |
| } else { // 支付失败 | |
| //oAlert(JSON.stringify(res)); | |
| payCallback('fail', orderData, done, fail); | |
| } | |
| }); | |
| return; | |
| } | |
| // 接口未返回支付包,从微信服务器获取 | |
| orderData.urlType = 'app'; | |
| ddb.get(url, orderData, function(d) { | |
| if (+d.ret === 0) { | |
| WeixinJSBridge.invoke('getBrandWCPayRequest', d.msg, function(res) { | |
| // oAlert(res.err_msg); | |
| if (res.err_msg === 'get_brand_wcpay_request:ok') { // 支付成功 | |
| payCallback('ok', orderData, done, fail); | |
| } else if (res.err_msg === 'get_brand_wcpay_request:cancel') { // 取消支付 | |
| payCallback('cancel', orderData, done, fail); | |
| } else { // 支付失败 | |
| payCallback('fail', orderData, done, fail); | |
| } | |
| }); | |
| } else { | |
| alert('获取微信支付包失败:' + d.msg); | |
| // ddb.debug(d); | |
| } | |
| }); | |
| } else if (ddb.isApp) { // 调用 app 支付 | |
| orderData.payChannel = 'wxpay'; | |
| orderData.payInfo = orderData.pay_order_info.wx_prepay_id; | |
| appPay(1); | |
| } | |
| } | |
| // 支付宝网页支付 | |
| function aliWebPay() { | |
| url = 'order/h5_alipay'; | |
| var webappPath = 'http://' + ddb.host + '/webapp/'; | |
| var payData = { | |
| order_number: orderNumber, | |
| return_url: webappPath + 'pay_success.html?pay_type=aliwebpay&order_number=' + orderNumber | |
| }; | |
| // 如果是包车订单 | |
| if (orderData.isCharteredBus) { | |
| url = 'chartered/h5_alipay'; | |
| payData = { | |
| order_id: orderNumber, | |
| return_url: webappPath + 'chartered_bus.html?pay_type=aliwebpay&order_id=' + orderNumber, | |
| //return_url: payData.return_url + '&order_id=' + orderNumber, | |
| total_amount: orderData.real_price // 单位为分 | |
| }; | |
| // url = 'chartered/pay_order'; | |
| // payData = { | |
| // order_id: orderNumber, | |
| // return_url: webappPath + 'chartered_bus.html?pay_type=aliwebpay&order_id=' + orderNumber +'#page-order-details', | |
| // pay_stage:orderData.pay_stage, | |
| // pay_type:orderData.pay_type, | |
| // total_amount: orderData.real_price // 单位为分 | |
| // }; | |
| // 已有支付页数据 | |
| // if (orderData.isPayOrder && orderData.alipay_html) { | |
| // $(orderData.alipay_html).hide().appendTo('body'); | |
| // return; | |
| // } | |
| } | |
| ddb.get(url, payData, function(d) { | |
| if (+d.ret !== 0) { | |
| alert(d.msg); | |
| return; | |
| } | |
| // 支付宝网页支付的回调在这里执行,包车因为要弹窗不执行回调 | |
| // if (!orderData.isCharteredBus) { | |
| done(orderNumber); | |
| // } | |
| $(d.data.alipay_html).hide().appendTo('body'); | |
| }); | |
| } | |
| } | |
| function Msg(s) { | |
| // return ddb.Popup.msg(s); | |
| return ddb.Toast.show(s); | |
| } | |
| // 跑马灯函数 | |
| function marqueeLine(target, type) { | |
| var obj = $('.' + target); | |
| $.each(obj, function(i, ele) { | |
| $(ele).removeClass('m-marquee'); | |
| var html = $(ele).html(); | |
| var dataHtml = $(ele).data("html"); | |
| if (!type) { | |
| type = 'default'; | |
| } | |
| if (dataHtml && type.indexOf('change') === -1) { | |
| html = dataHtml; | |
| } | |
| $(ele).html("<span>" + html + "</span>"); | |
| var curr_w = $(ele).width() - parseFloat($(ele).css('padding-left')); | |
| var real_w = $(ele).find('span').width(); | |
| if (real_w > curr_w) { | |
| $(ele).data("html", html); | |
| $(ele).html("<p><label><span>" + html + "</span><span>" + html + "</span></label></p>"); | |
| $(ele).addClass("m-marquee"); | |
| var pd_right = parseFloat($(ele).find('span').css('padding-right')); | |
| var lbl = $(ele).find('label'); | |
| lbl.width(2 * (real_w + pd_right)); | |
| if (type.indexOf('auto') !== -1) { | |
| var speed = 3 * Math.floor(real_w / curr_w) + 7; | |
| if (speed > 20) { | |
| speed = 20; | |
| } | |
| lbl[0].style.cssText += "-webkit-animation: marquee " + speed + "s linear 1.5s infinite;"; | |
| lbl[0].style.cssText += "animation: marquee " + speed + "s linear 1.5s infinite;"; | |
| } | |
| } else { | |
| $(ele).html(html); | |
| } | |
| }); | |
| } | |
| // hack: iOS 微信无法修改标题 | |
| function setTitle(title) { | |
| document.title = title; | |
| if ($.os.ios) { | |
| var $iframe = $('<iframe src="/favicon.ico" style="display:none;"></iframe>').on('load', function() { | |
| setTimeout(function() { | |
| $iframe.off('load').remove(); | |
| }, 0); | |
| }).appendTo('body'); | |
| } | |
| } | |
| ddb.jump = jump; // 只能用于业务页面跳转,容易误用不推荐使用 | |
| ddb.ajax = ddbAjax; | |
| ddb.get = DdbGet; | |
| ddb.post = DdbPost; | |
| ddb.upload = upload; | |
| ddb.getJsonp = DdbGetJsonp; | |
| ddb.store = store; | |
| ddb.pgps = session; | |
| ddb.session = session; | |
| ddb.removeStoragesByKeyContains = removeStoragesByKeyContains; | |
| ddb.removeStoragesBut = removeStoragesBut; | |
| ddb.cookie = Cookie; | |
| ddb.payOrder = payOrder; | |
| ddb.debug = showDebug; | |
| ddb.msg = Msg; | |
| ddb.payCallback = payCallback; | |
| ddb.getOpenId = getOpenId; | |
| ddb.marqueeLine = marqueeLine; | |
| ddb.setTitle = setTitle; | |
| // hack: iOS QQ 浏览器 sessionStorage 不能跨页面访问 | |
| if ($.os.ios && /MQQBrowser/i.test(navigator.userAgent)) { | |
| ddb.session = ddb.pgps = ddb.store; | |
| } | |
| // 获取微信用户信息(可以得到未关注本微信号的人的基本信息) | |
| ddb.getWxUserInfo = function(redirectUri, scope, appid) { | |
| redirectUri = (redirectUri || location.href).replace(/\/\/\w+\.wechat/, '//wechat'); | |
| // 应用授权作用域:snsapi_base 不弹出授权页面,直接跳转,只能获取用户 openid; | |
| // snsapi_userinfo 弹出授权页面,可通过 openid 拿到昵称、性别、所在地,并且即使在未关注的情况下,只要用户授权,也能获取其信息 | |
| scope = scope === 'userinfo' ? 'snsapi_userinfo' : 'snsapi_base'; | |
| appid = appid || 'wx72a2b17c7ed41fe8'; | |
| var url = [ | |
| 'https://open.weixin.qq.com/connect/oauth2/authorize?', | |
| 'appid=' + appid, | |
| '&redirect_uri=' + encodeURIComponent(redirectUri), | |
| '&response_type=' + 'code', | |
| '&scope=' + scope, | |
| '#wechat_redirect' | |
| ].join(''); | |
| location = url; | |
| }; | |
| // 清除 XHR 对象 | |
| ddb.abortXHRs = function() { | |
| // var xhrs = ddb.xhrs.splice(0, ddb.xhrs.length); | |
| ddb.xhrs.forEach(function(xhr) { | |
| xhr.abort(); | |
| console.log('Abort XHR: ', xhr); | |
| }); | |
| ddb.xhrs = []; | |
| }; | |
| // 添加微信分享提示弹层 | |
| ddb.showShareit = function() { | |
| if (!ddb.isWeixin) { | |
| alert('请在嗒嗒巴士公众号中分享'); | |
| // ddb.wx.gotoPublic(); | |
| return; | |
| } | |
| var shareit = document.getElementById('shareit'); | |
| if (!shareit) { | |
| $('<div id="shareit"><p>点击右上角分享</p></div>').appendTo('body') | |
| .on('click', function(e) { | |
| this.style.display = 'none'; | |
| }); | |
| } else { | |
| shareit.style.display = 'block'; | |
| } | |
| }; | |
| // 获取页面自定义跳转项 | |
| ddb.getPageLink = function(opt) { | |
| var postData = { | |
| item_type: opt.item_type || 1, | |
| line_code: opt.line_code, | |
| noLoading: true | |
| }; | |
| if (opt.startDate) { | |
| postData.start_date = opt.start_date; | |
| } | |
| ddb.get('line/get_line_config', postData, function(d) { | |
| if (+d.ret === 0) { | |
| // 当有1个项目时,靠左显示,最长不超过18个字数; | |
| // 当有2个项目时,当有一个字数超过8-15个字的时候,两端顶部对齐;当字数都小于8个的时候,从左向右依次排开; | |
| // 当有3个项目时,两端对齐,平均分布,最长不超过8个字数; | |
| // 最多3项 | |
| var link = {}; | |
| link.type = {}; | |
| link.list = d.data.item_list.slice(0, 3).map(function(item, i, arr) { | |
| var str = item.title; | |
| var length = 18; | |
| var truncation = '...'; | |
| switch (arr.length) { | |
| case 1: | |
| item.title = str.length > length ? str.slice(0, length) + truncation : str; | |
| break; | |
| case 2: | |
| length = 16; // 15=>16暂时兼容“联系电话:12345678902”这种情况 | |
| item.title = str.length > length ? str.slice(0, length) + truncation : str; | |
| break; | |
| case 3: | |
| length = 8; | |
| item.title = str.length > length ? str.slice(0, length) + truncation : str; | |
| break; | |
| } | |
| return item; | |
| }); | |
| // 当有2个项目时,当字数都小于8个的时候 | |
| if (link.list.length === 2 && link.list.every(less8)) { | |
| link.type.less8 = true; | |
| } | |
| opt.callback(link); | |
| } else { | |
| alert(d.msg); | |
| } | |
| function less8(item) { | |
| return item.title.length < 8; | |
| } | |
| }); | |
| }; | |
| // 设备信息 | |
| ddb.device = (function() { | |
| var dpr = window.devicePixelRatio || 1; | |
| // 如果物理像素与实际像素相等说明返回的值可能有误(比如某些三星手机) | |
| if (screen.width === document.documentElement.clientWidth) { | |
| return { | |
| width: screen.width * dpr, | |
| height: screen.height * dpr, | |
| dpr: dpr | |
| }; | |
| } | |
| return { | |
| width: screen.width, | |
| height: screen.height, | |
| dpr: dpr | |
| }; | |
| })(); | |
| // 接口通用参数 | |
| ddb.common = { | |
| version: ddb.version, | |
| user_id: '0', // 用户 ID,未登录为 0 | |
| login_type: 1, // 乘客端 | |
| device_type: 3, // 设备类型:1-安卓,2-IOS,3-WEB | |
| // mobile: '', // 用户绑定的手机号,未登录为空字符串 | |
| // device_id: '', // 设备 ID | |
| // ddb_token: '', // 有 ddb_token 就不传 login_token | |
| // login_token: '', // 登录令牌信息,用于 WEB 端的登录校验 | |
| // ddb_src_id: '', | |
| // lat: 1, // 用户当前纬度 | |
| // lng: 1, // 用户当前经度 | |
| // page_size: 6, // 当前页大小 | |
| // page_index: 1, // 当前页码 | |
| screen: ddb.device.width + ':' + ddb.device.height + '|' + ddb.device.dpr, // 用户设备信息 | |
| source: ddb.isWeixin ? 3 : 5 // 请求来源:1-安卓,2-IOS,3-微信,4-快捷购票,5-webapp | |
| }; | |
| // 获取并缓存渠道号 | |
| var ddbSrcId = B.url.getParam('ddb_src_id'); | |
| if (ddbSrcId) { | |
| ddb.session('ddb_src_id', ddbSrcId); | |
| } | |
| // 初始化通用参数 | |
| initCommon(); | |
| })(); | |
| // 是否在某路径下,参数为单个或多个路径名,如:'public|volunteer' | |
| // ddb.inPublic = location.pathname.indexOf('/public/') !== -1; | |
| ddb.inPath = function(pathname) { | |
| return new RegExp('/(' + pathname + ')/', 'i').test(location.pathname); | |
| }; | |
| ddb.fileName = location.pathname.slice(location.pathname.lastIndexOf('/') + 1); | |
| // 微信相关接口 | |
| ddb.wx = {}; | |
| // 是否设置分享 | |
| // ddb.wx.noShare = ddb.inPath('public|volunteer'); | |
| // 获取微信 JSSDK_CFG、openid | |
| ddb.wx.getInfo = function(url, callback) { | |
| if (!ddb.isWeixin) { | |
| return; | |
| } | |
| // 如果未提供 url 参数 | |
| if (typeof url === 'function') { | |
| callback = url; | |
| url = location.href.split('#')[0]; | |
| } | |
| ddb.get(ddb.wxapi + 'wechat_api/jssdk', { | |
| urlType: 'app', | |
| wxUrl: url, | |
| noLoading: true | |
| }, function(d) { | |
| if (0 !== +d.ret) { | |
| // alert(d.msg); | |
| return; | |
| } | |
| ddb.JSSDK_CFG = d.JSSDK_CFG; // 缓存 JSSDK | |
| ddb.openid = d.JSSDK_CFG.open_id; // 缓存 openid | |
| // 回调函数 | |
| if (callback) { | |
| callback(d.JSSDK_CFG); | |
| } | |
| }); | |
| }; | |
| // 设置微信分享 | |
| ddb.wx.shareConfig = { | |
| title: '嗒嗒巴士送你上下班', | |
| desc: '上下班坐公交是玩命,坐专车是烧钱,坐嗒嗒巴士走心。', | |
| link: location.href, | |
| imgUrl: 'http://' + ddb.host + '/webapp/image/side_avatar_default.png', | |
| timeline: { // 分享到朋友圈 | |
| imgUrl: 'http://' + ddb.host + '/webapp/image/side_avatar_default_memory.png' | |
| }, | |
| appMessage: {}, // 发送给朋友 | |
| QQ: {}, // 分享到 QQ | |
| QZone: {} // 分享到 QQ 空间 | |
| }; | |
| // 配置微信接口 | |
| ddb.wx.setConfig = function (cfg, debug) { | |
| if (ddb.wx.hasConfig) { | |
| return; | |
| } | |
| wx.config($.extend({ | |
| debug: debug || false, | |
| appId: cfg.msg.appId, | |
| timestamp: cfg.msg.timestamp, | |
| nonceStr: cfg.msg.nonceStr, | |
| signature: cfg.msg.signature, | |
| jsApiList: [ | |
| 'onMenuShareTimeline', | |
| 'onMenuShareAppMessage', | |
| 'onMenuShareQQ', | |
| 'onMenuShareQZone', | |
| 'chooseImage', | |
| 'previewImage', | |
| 'openLocation', | |
| 'getLocation', | |
| 'hideMenuItems', | |
| 'showMenuItems', | |
| 'closeWindow', | |
| 'getNetworkType' | |
| ] | |
| }, cfg.config || {})); | |
| ddb.wx.hasConfig = true; | |
| }; | |
| ddb.wx.share = function (cfg, debug) { | |
| // 只在微信中才执行分享 | |
| if (!ddb.isWeixin || !window.wx) { | |
| return; | |
| } | |
| // 控制被分享页某些按钮的显示 | |
| var isShare = cfg.isShare || B.url.getParam('share'); | |
| if (1 == isShare) { | |
| $('nav button').addClass('showNone').filter('.publicNum').removeClass('showNone'); | |
| } | |
| // 如果调用时没指定配置,则从缓存中读取 | |
| cfg.JSSDK_CFG = cfg.JSSDK_CFG || ddb.JSSDK_CFG; | |
| // 分享没设置完成前先隐藏分享菜单项 | |
| ddb.wx.hideShareMenu(cfg.JSSDK_CFG); | |
| if (cfg.url) { | |
| ddb.wx.getInfo(cfg.url, wxShare); | |
| } else if (cfg.JSSDK_CFG) { | |
| wxShare(cfg.JSSDK_CFG); | |
| } else { | |
| ddb.wx.getInfo(wxShare); | |
| } | |
| // 微信分享 | |
| function wxShare(JSSDK_CFG) { | |
| ddb.wx.shared = true; | |
| ddb.wx.setConfig(JSSDK_CFG, debug); | |
| wx.ready(function() { | |
| var JSSDK_Share = $.extend({}, ddb.wx.shareConfig, cfg.JSSDK_Share); | |
| var shareCfg = { | |
| title: JSSDK_Share.title, | |
| desc: JSSDK_Share.desc, | |
| link: JSSDK_Share.link, | |
| imgUrl: JSSDK_Share.imgUrl | |
| }; | |
| shareCfg.success = function(res) { | |
| // oAlert(JSON.stringify(res)); | |
| // 隐藏分享提示 | |
| if (document.getElementById('shareit')) { | |
| $('#shareit').hide(); | |
| } | |
| // 上报分享统计 | |
| // oAlert('wxshare.' + cfg.mtaid + '.' + res.errMsg.replace(':ok', '')); | |
| if (window.MtaH5 && cfg.mtaid) { | |
| MtaH5.clickStat('wxshare.' + cfg.mtaid + '.' + res.errMsg.replace(':ok', '')); | |
| } | |
| }; | |
| // 分享到朋友圈 | |
| wx.onMenuShareTimeline($.extend([], shareCfg, JSSDK_Share.timeline)); | |
| // 分享给朋友 | |
| wx.onMenuShareAppMessage($.extend([], shareCfg, JSSDK_Share.appMessage)); | |
| // 分享到 QQ | |
| wx.onMenuShareQQ($.extend([], shareCfg, JSSDK_Share.QQ)); | |
| // 分享到 QQ 空间 | |
| wx.onMenuShareQZone($.extend([], shareCfg, JSSDK_Share.QZone)); | |
| // 分享设置后显示分享菜单 | |
| var menus = [ | |
| 'menuItem:share:appMessage', | |
| 'menuItem:share:timeline', | |
| 'menuItem:share:qq', | |
| 'menuItem:share:QZone' | |
| ]; | |
| // 设置分享渠道:1-微信好友;2-微信朋友圈;3-QQ;4-QQ空间 | |
| if (JSSDK_Share.channels) { | |
| menus = JSSDK_Share.channels.split(',').map(function(item) { | |
| return menus[item - 1]; | |
| }); | |
| } | |
| // oAlert(JSON.stringify(menus)); | |
| ddb.wx.showShareMenu(JSSDK_CFG, menus); | |
| setTimeout(function() { | |
| ddb.wx.showShareMenu(JSSDK_CFG, menus); | |
| }, 1000); | |
| // ddb.wx.showShareMenu(); | |
| }); | |
| // config 信息验证失败执行,具体错误信息可以在 res 参数中查看 | |
| // TODO: 对于 SPA 可以在这里更新签名。 | |
| wx.error(function(res) { | |
| console.log(res); | |
| }); | |
| } | |
| }; | |
| // 隐藏微信分享菜单 | |
| ddb.wx.hideShareMenu = function(JSSDK_CFG, menus) { | |
| // 只在微信中才执行分享 | |
| if (!ddb.isWeixin || !window.wx) { | |
| return; | |
| } | |
| JSSDK_CFG = JSSDK_CFG || ddb.JSSDK_CFG; | |
| if (JSSDK_CFG) { | |
| hideShare(JSSDK_CFG); | |
| } else { | |
| ddb.wx.getInfo(hideShare); | |
| } | |
| function hideShare(JSSDK_CFG) { | |
| // 微信接口配置 | |
| ddb.wx.setConfig(JSSDK_CFG); | |
| // wx.config({ | |
| // debug: false, | |
| // appId: JSSDK_CFG.msg.appId, | |
| // timestamp: JSSDK_CFG.msg.timestamp, | |
| // nonceStr: JSSDK_CFG.msg.nonceStr, | |
| // signature: JSSDK_CFG.msg.signature, | |
| // jsApiList: [ | |
| // 'onMenuShareTimeline', | |
| // 'onMenuShareAppMessage', | |
| // 'onMenuShareQQ', | |
| // 'onMenuShareQZone', | |
| // 'openLocation', | |
| // 'getLocation', | |
| // 'hideMenuItems', | |
| // 'showMenuItems' | |
| // ] | |
| // }); | |
| wx.ready(function() { | |
| menus = menus || [ | |
| 'menuItem:share:appMessage', | |
| 'menuItem:share:timeline', | |
| 'menuItem:share:qq', | |
| 'menuItem:share:QZone' | |
| ]; | |
| wx.hideMenuItems({menuList: menus}); | |
| }); | |
| } | |
| }; | |
| // 显示微信分享菜单 | |
| ddb.wx.showShareMenu = function(JSSDK_CFG, menus) { | |
| // 只在微信中才执行分享 | |
| if (!ddb.isWeixin || !window.wx) { | |
| return; | |
| } | |
| JSSDK_CFG = JSSDK_CFG || ddb.JSSDK_CFG; | |
| if (JSSDK_CFG) { | |
| showShare(JSSDK_CFG); | |
| } else { | |
| ddb.wx.getInfo(showShare); | |
| } | |
| function showShare(JSSDK_CFG) { | |
| // 微信接口配置 | |
| ddb.wx.setConfig(JSSDK_CFG); | |
| // wx.config({ | |
| // debug: false, | |
| // appId: JSSDK_CFG.msg.appId, | |
| // timestamp: JSSDK_CFG.msg.timestamp, | |
| // nonceStr: JSSDK_CFG.msg.nonceStr, | |
| // signature: JSSDK_CFG.msg.signature, | |
| // jsApiList: [ | |
| // 'onMenuShareTimeline', | |
| // 'onMenuShareAppMessage', | |
| // 'onMenuShareQQ', | |
| // 'onMenuShareQZone', | |
| // 'openLocation', | |
| // 'getLocation', | |
| // 'hideMenuItems', | |
| // 'showMenuItems' | |
| // ] | |
| // }); | |
| wx.ready(function() { | |
| menus = menus || [ | |
| 'menuItem:share:appMessage', | |
| 'menuItem:share:timeline', | |
| 'menuItem:share:qq', | |
| 'menuItem:share:QZone' | |
| ]; | |
| wx.showMenuItems({menuList: menus}); | |
| }); | |
| } | |
| }; | |
| // 获取是否已关注公众号 | |
| ddb.wx.getFollowStatus = function(callback) { | |
| if (!ddb.isWeixin) { | |
| return; | |
| } | |
| if (ddb.JSSDK_CFG) { | |
| getStatus(ddb.JSSDK_CFG); | |
| } else { | |
| ddb.wx.getInfo(getStatus); | |
| } | |
| function getStatus(JSSDK_CFG) { | |
| ddb.get('/wechat_api/isSubscribe', { | |
| urlType: 'app', | |
| dataType: 'text', | |
| openid: JSSDK_CFG.open_id, | |
| notCheckLogin: true | |
| }, function(status) { | |
| var hasFollowed = parstatus !== '0'; | |
| callback(hasFollowed); | |
| }); | |
| } | |
| }; | |
| // 转到微信关注引导页 | |
| ddb.wx.gotoPublic = function() { | |
| location.href = 'http://mp.weixin.qq.com/s?__biz=MzAxNDMzNjc2MQ==&mid=209057391&idx=1&sn=c3686736a269a755c2b3bbb69dcddf91&scene=1&key=1936e2bc22c2ceb5f0422d19def4dd7e2ead657bd6a2be972adadb5206e9105a41e4bcaeaabb99c6bb8a0a9c37a78489&ascene=1&uin=MTAzNDg1ODg4MQ%3D%3D&devicetype=Windows+8&version=61000721&pass_ticket=Koa33YxOOGuMY5d5XE%2BTNfpOefmOQ0oQUIO%2BVO0f9PbEwF0GPMj%2BeH1mkKvSd45M'; | |
| return false; | |
| }; | |
| // jump 跳转 | |
| ddb.jumpCommonUrl = function(page) { | |
| var url = 'http://' + ddb.sld + 'jump.buskeji.com/common/load?page=' + page; | |
| url = B.url.setObj(url, { | |
| version: ddb.version, | |
| device_type: 3, | |
| city_code: ddb.store('ddbCity') ? ddb.store('ddbCity').split('/')[1] : '0755' | |
| }); | |
| window.location = url; | |
| }; | |
| // 滚动到距离底100像素时执行回调 | |
| ddb.scrollRefresh = function(elem, callback) { | |
| if (typeof elem === 'function') { | |
| callback = elem; | |
| elem = document.body; | |
| } | |
| var canScrollHeight = elem.scrollHeight - document.documentElement.clientHeight; | |
| var scrollbarFromFooter = canScrollHeight - elem.scrollTop; | |
| // console.log(canScrollHeight); | |
| // console.log(elem.scrollTop); | |
| // console.log(scrollbarFromFooter); | |
| if (scrollbarFromFooter < 100) { | |
| callback(); | |
| } | |
| }; | |
| // 设置分享 | |
| ddb.setShare = function(config, callback) { | |
| // 如果不在微信或 app 中不处理 | |
| if (!ddb.isWeixin && !ddb.isApp) { | |
| return; | |
| } | |
| // ddb.wx.hideShareMenu(); | |
| ddb.wx.shared = true; | |
| config.notCheckLogin = true; | |
| config.noLoading = true; | |
| // 未登录 | |
| // if (!B.user.isLogin()) { | |
| // ddb.wx.share({ | |
| // mtaid: config.mtaid, | |
| // JSSDK_Share: { | |
| // title: '嗒嗒巴士送你上下班', | |
| // desc: '上下班坐公交是玩命,坐专车是烧钱,坐嗒嗒巴士走心', | |
| // link: location.href | |
| // } | |
| // }); | |
| // return; | |
| // } | |
| ddb.get('share/get_share_url', config, function(d) { | |
| if (+d.ret === 0) { | |
| var channels = d.data.share_channel_list.map(function(item) { | |
| return item.share_channel_id; | |
| }); | |
| var shareCfg = { | |
| title: d.data.share_title, | |
| desc: d.data.share_detail, | |
| link: ddb.fitEnv(d.data.share_url), | |
| channels: channels.join(',') | |
| }; | |
| d.data.share_channel_list.forEach(function(item) { | |
| var cfg = {}; | |
| if (item.share_title) { | |
| cfg.title = item.share_title; | |
| } | |
| if (item.share_detail) { | |
| cfg.desc = item.share_detail; | |
| } | |
| if (item.share_url) { | |
| cfg.link = item.share_url; | |
| } | |
| if (item.share_icon) { | |
| cfg.imgUrl = item.share_icon; | |
| } | |
| switch (+item.share_channel_id) { | |
| case 1: | |
| shareCfg.appMessage = cfg; | |
| break; | |
| case 2: | |
| shareCfg.timeline = cfg; | |
| break; | |
| case 3: | |
| shareCfg.QQ = cfg; | |
| break; | |
| case 4: | |
| shareCfg.QZone = cfg; | |
| break; | |
| } | |
| }); | |
| ddb.wx.share({ | |
| mtaid: config.mtaid, | |
| JSSDK_Share: shareCfg | |
| }); | |
| if (typeof callback === 'function') { | |
| callback($.extend({ | |
| imgUrl: ddb.wx.shareConfig.imgUrl, | |
| appCfg: JSON.stringify(d.data) | |
| }, shareCfg)); | |
| } | |
| } | |
| }); | |
| }; | |
| // 公用 ui 组件 | |
| ddb.ui = {}; | |
| ddb.tl = {}; | |
| // ddb 价格统一显示函数,整数显示整数,小数显示一位小数 | |
| ddb.tl.fixPrice = function(price) { | |
| if (typeof price === "undefined" || !price) { | |
| return price; | |
| } | |
| var oNum = price.toString(); | |
| if (price == 0) { | |
| return '0'; | |
| } | |
| if (oNum.indexOf('.') == -1) { | |
| return price; | |
| } | |
| var arr = oNum.split('.'); | |
| var arr_t = arr[1]; | |
| if (arr[0] == 0) { | |
| arr[0] = 0; | |
| } | |
| if (arr_t.length >= 2) { | |
| arr_t = arr_t.substr(0, 2); | |
| } | |
| for (var i = 0, len = arr_t.length; i < len; i++) { | |
| if (arr_t.length > 0 && arr_t.charAt(arr_t.length - 1) == 0) { | |
| arr_t = arr_t.slice(0, -1); | |
| } | |
| } | |
| return arr_t.length > 0 ? arr[0] + '.' + arr_t : arr[0]; | |
| }; | |
| ddb.tl.loadContent = function(url,data,callback){ | |
| return $.ajax({ | |
| url : url, | |
| dataType : 'html', | |
| timeout : data.timeout || 15000, | |
| cache:true, | |
| data : data, | |
| success : function(html){ | |
| callback && callback(html); | |
| },error:function(e){ | |
| alert("网络异常!"); | |
| //console.log(e); | |
| } | |
| }); | |
| }; | |
| ddb.tl.loadCss = function(url){ | |
| $("<link>") | |
| .attr({ rel: "stylesheet", | |
| type: "text/css", | |
| href: url | |
| }) | |
| .appendTo("head"); | |
| }; | |
| // 深层对象拷贝, 返回拷贝后的对象, 剪断js对象引用链 | |
| ddb.tl.clone = function(obj) { | |
| return JSON.parse(JSON.stringify(obj)); | |
| }; | |
| //公用弹出框 | |
| ddb.Popup = (function(){ | |
| var __timer,_popup,_mask,transition,clickMask2close, | |
| POSITION = { | |
| 'center':{ | |
| top:'50%', | |
| left:'.5rem', | |
| right:'.5rem', | |
| 'border-radius' : '.2rem' | |
| } | |
| }, | |
| TEMPLATE = { | |
| msg: '<div class="popup-content popup-msg {_class}">{content}</div>', | |
| alert: '<div class="popup-title {_class}">{title}</div><div class="popup-content {_class}">{content}</div><div id="ddb_popup_btn_container"><a data-target="closePopup" data-icon="checkmark">{ok}</a></div>', | |
| tips: '<div class="popup-tips-title">{title}</div><div class="popup-tips-content">{content}</div>', | |
| confirm: '<div class="popup-title {_class}">{title}</div><div class="popup-content {_class}">{content}</div><div id="ddb_popup_btn_container"><a class="cancel" data-icon="close">{cancel}</a><a data-icon="checkmark">{ok}</a></div>', | |
| intro: '<div class="popup-title {_class}">{title}</div><div class="popup-content {_class}">{content}</div><div id="ddb_popup_btn_container"><a class="ddb_popup_intro_ok" data-icon="checkmark">{ok}</a></div>', | |
| loading: '<i class="icon spinner"></i>', | |
| center: '<div class="popup_tips {_class}">{_img}<div class="popup_tips_title">{title}</div><div class="popup_tips_text1">{text1}</div><div class="popup_tips_text2">{text2}</div></div>' | |
| }; | |
| /** | |
| * 全局只有一个popup实例 | |
| * @private | |
| */ | |
| var _init = function(){ | |
| $('body').append('<div id="ddb_popup"></div><div id="ddb_popup_mask"></div>'); | |
| _mask = $('#ddb_popup_mask'); | |
| _popup = $('#ddb_popup'); | |
| _subscribeEvents(); | |
| }; | |
| /** | |
| * loading组件 | |
| * @param text 文本,默认为“加载中...” | |
| */ | |
| var loading = {}; | |
| loading.show = function(text) { | |
| var markup = TEMPLATE.loading; | |
| show({ | |
| html: markup, | |
| pos: 'loading', | |
| opacity: 0.1, | |
| animation: true, | |
| clickMask2Close: false | |
| }); | |
| }; | |
| loading.hide = function() { | |
| hide(); | |
| }; | |
| var show = function(options,fn){ | |
| var settings = { | |
| height : undefined,//高度 | |
| width : undefined,//宽度 | |
| opacity : 0.6,//透明度 | |
| html : '',//popup内容 | |
| pos : 'center',//位置 {@String top|top-second|center|bottom|bottom-second} {@object css样式} | |
| clickMask2Close : true,// 是否点击外层遮罩关闭popup | |
| showCloseBtn : true,// 是否显示关闭按钮 | |
| onShow : undefined //@event 在popup内容加载完毕,动画开始前触发 | |
| }; | |
| $.extend(settings,options); | |
| clickMask2close = settings.clickMask2Close; | |
| _mask.css('opacity',settings.opacity); | |
| //rest position and class | |
| _popup.attr({'style':'','class':''}); | |
| settings.width && _popup.width(settings.width); | |
| settings.height && _popup.height(settings.height); | |
| var pos_type = $.type(settings.pos); | |
| if(pos_type == 'object'){// style | |
| _popup.css(settings.pos); | |
| }else if(pos_type == 'string'){ | |
| if(POSITION[settings.pos]){ //已经默认的样式 | |
| _popup.css(POSITION[settings.pos]); | |
| var trans_key = settings.pos.indexOf('top')>-1?'top':(settings.pos.indexOf('bottom')>-1?'bottom':'defaultAnim'); | |
| }else{// pos 为 class | |
| _popup.addClass(settings.pos); | |
| } | |
| }else{ | |
| console.error('错误的参数!'); | |
| return; | |
| } | |
| _mask.show(); | |
| var html; | |
| if(settings.html){ | |
| html = settings.html; | |
| }else if(settings.url){//远程加载 | |
| html = J.Page.loadContent(settings.url); | |
| }else if(settings.tplId){//加载模板 | |
| html = template(settings.tplId, settings.tplData); | |
| } | |
| //是否显示关闭按钮 | |
| if(settings.showCloseBtn){ | |
| html += '<div id="tag_close_popup" data-target="closePopup" class="icon cancel-circle"></div>'; | |
| } | |
| _popup.html(html).show(); | |
| //执行onShow事件,可以动态添加内容 | |
| settings.onShow && settings.onShow.call(_popup); | |
| //显示获取容器高度,调整至垂直居中 | |
| if(settings.pos == 'center'){ | |
| var height = _popup.height(); | |
| _popup.css('margin-top', '-' + height / 2 + 'px'); | |
| } | |
| fn&&fn(); | |
| }; | |
| /** | |
| * 关闭弹出框 | |
| * @param noTransition 立即关闭,无动画 | |
| */ | |
| var hide = function(noTransition){ | |
| _mask.hide(); | |
| _popup.hide().empty(); | |
| }; | |
| var _subscribeEvents = function(){ | |
| _mask.on('click',function(){ | |
| clickMask2close && hide(); | |
| }); | |
| _popup.on('click', '[data-target="closePopup"]', function() { | |
| hide(); | |
| }); | |
| }; | |
| /** | |
| * alert组件 | |
| * @param title 标题 | |
| * @param content 内容 | |
| */ | |
| var alert = function(title,content,btnName){ | |
| var markup = TEMPLATE.alert.replace('{title}',title).replace('{content}',content).replace('{ok}',btnName || '确定'); | |
| show({ | |
| html : markup, | |
| pos : 'center', | |
| opacity : 0.6, | |
| showCloseBtn : false | |
| }); | |
| }; | |
| /** | |
| * tip组件 | |
| * @param title 标题 | |
| * @param content 内容 | |
| */ | |
| var tips = function(title,content,btnName){ | |
| var markup = TEMPLATE.tips.replace('{title}',title).replace('{content}',content); | |
| show({ | |
| html : markup, | |
| pos : 'center', | |
| opacity : 0.6, | |
| showCloseBtn : false | |
| }); | |
| }; | |
| /** | |
| * confirm 组件 | |
| * @param title 标题 | |
| * @param content 内容 | |
| * @param okCall 确定按钮handler | |
| * @param cancelCall 取消按钮handler | |
| */ | |
| var confirm = function(className, title, content, cancelText, okText, okCall, cancelCall, clickMask2Close) { | |
| if ($.isPlainObject(className)) { | |
| var options = $.extend({ | |
| className: '', | |
| title: '', | |
| content: '', | |
| okText: '', | |
| cancelText: '', | |
| clickMask2Close: true, | |
| okCall: function() {}, | |
| cancelCall: function() {} | |
| }, className); | |
| clickMask2Close = options.clickMask2Close; | |
| className = options.className; | |
| title = options.title; | |
| content = options.content; | |
| cancelText = options.cancelText; | |
| okText = options.okText; | |
| okCall = options.okCall; | |
| cancelCall = options.cancelCall; | |
| } else { | |
| cancelText = cancelText || '取消'; | |
| okText = okText || '确定'; | |
| } | |
| show({ | |
| html: TEMPLATE.confirm.replace('{title}', title).replace('{content}', content).replace('{cancel}', cancelText).replace('{ok}', okText).replace(/{_class}/g, className), | |
| pos: 'center', | |
| opacity: 0.6, | |
| showCloseBtn: false, | |
| clickMask2Close: clickMask2Close | |
| }); | |
| $('#ddb_popup_btn_container [data-icon="checkmark"]').on('click', function() { | |
| okCall.call(this); | |
| hide(); | |
| }); | |
| $('#ddb_popup_btn_container [data-icon="close"]').on('click', function() { | |
| cancelCall.call(this); | |
| hide(); | |
| }); | |
| }; | |
| /** | |
| * intro 组件 | |
| * @param title 标题 | |
| * @param content 内容 | |
| * @param okCall 确定按钮handler | |
| */ | |
| var intro = function(className, title, content, okText, okCall, clickMask2Close) { | |
| if ($.isPlainObject(className)) { | |
| var options = $.extend({ | |
| className: '', | |
| title: '', | |
| content: '', | |
| okText: '', | |
| clickMask2Close: true, | |
| okCall: function() {} | |
| }, className); | |
| clickMask2Close = options.clickMask2Close; | |
| className = options.className; | |
| title = options.title; | |
| content = options.content; | |
| okText = options.okText; | |
| okCall = options.okCall; | |
| } else { | |
| okText = okText || '确定'; | |
| } | |
| show({ | |
| html: TEMPLATE.intro.replace('{title}', title).replace('{content}', content).replace('{ok}', okText).replace(/{_class}/g, className), | |
| pos: 'center', | |
| opacity: 0.6, | |
| showCloseBtn: false, | |
| clickMask2Close: clickMask2Close | |
| }); | |
| $('#ddb_popup_btn_container [data-icon="checkmark"]').on('click', function() { | |
| okCall.call(this); | |
| hide(); | |
| }); | |
| }; | |
| /** | |
| * msg 组件 消息弹框, 3s后自动消失 | |
| * @param content 内容 | |
| */ | |
| var msg = function(content){ | |
| if (__timer) { | |
| clearTimeout(__timer); | |
| } | |
| var markup = TEMPLATE.msg.replace('{content}',content); | |
| show({ | |
| html : markup, | |
| pos : 'center', | |
| opacity : 0.6, | |
| showCloseBtn : false | |
| }); | |
| //__timer = setTimeout(hide,3000); | |
| }; | |
| var center = function(img, opt, html) { | |
| if (typeof img !== 'string') { | |
| html = opt; | |
| opt = img; | |
| img = '<img src="/webapp/image/icon_success.png">'; | |
| } | |
| img = img || ''; | |
| opt = $.extend({ | |
| className: '', | |
| title: '', | |
| text1: '', | |
| text2: '', | |
| delay: 3000 | |
| }, opt || {}); | |
| html = html || TEMPLATE.center.replace('{_img}', img).replace('{title}', opt.title).replace('{text1}', opt.text1).replace('{text2}', opt.text2).replace('{_class}', opt.className); | |
| show({ | |
| html: html, | |
| pos: 'center', | |
| opacity: 0, // 透明度 | |
| showCloseBtn: false | |
| }, function() { | |
| $('#ddb_popup').css('background', 'rgba(0, 0, 0, 0)').addClass(opt.className); | |
| }); | |
| if (__timer) { | |
| clearTimeout(__timer); | |
| } | |
| __timer = setTimeout(function() { | |
| hide(); | |
| opt.callback && opt.callback(); | |
| }, opt.delay); | |
| }; | |
| _init(); | |
| return { | |
| loading: loading, | |
| show: show, | |
| close: hide, | |
| alert: alert, | |
| tips: tips, | |
| msg: msg, | |
| confirm: confirm, | |
| intro: intro, | |
| center: center | |
| }; | |
| })(); | |
| /** | |
| * 消息组件 | |
| */ | |
| ddb.Toast = (function($){ | |
| var toast_type = 'toast', | |
| _toast, timer, | |
| //定义模板 | |
| TEMPLATE = { | |
| toast : '<a href="#">{value}</a>', | |
| success : '<a href="#"><i class="icon checkmark-circle"></i>{value}</a>', | |
| error : '<a href="#"><i class="icon cancel-circle"></i>{value}</a></div>', | |
| info : '<a href="#"><i class="icon info-2"></i>{value}</a>' | |
| }; | |
| var _init = function(){ | |
| //全局只有一个实例 | |
| $('body').append('<div id="ddb_toast"></div>'); | |
| _toast = $('#ddb_toast'); | |
| _subscribeCloseTag(); | |
| }; | |
| /** | |
| * 关闭消息提示 | |
| */ | |
| var hide = function() { | |
| _toast.hide(); | |
| _toast.empty(); | |
| }; | |
| /** | |
| * 显示消息提示 | |
| * @param type 类型 toast|success|error|info 空格 ass name 可以实现自定义样式 | |
| * @param text 文字内容 | |
| * @param duration 持续时间 为0则不自动关闭,默认为3000ms | |
| */ | |
| var show = function(text,type,duration){ | |
| if(timer) clearTimeout(timer); | |
| type = type || 'toast'; | |
| duration = duration || 3000; | |
| var classname = type.split(/\s/); | |
| toast_type = classname[0]; | |
| _toast.attr('class',type).html(TEMPLATE[toast_type].replace('{value}',text)).show(); | |
| if(duration !== 0){//为0 不自动关闭 | |
| timer = setTimeout(hide,duration); | |
| } | |
| }; | |
| var _subscribeCloseTag = function(){ | |
| _toast.on('click','[data-target="close"]',function(){ | |
| hide(); | |
| }); | |
| }; | |
| _init(); | |
| return { | |
| show : show, | |
| hide : hide | |
| }; | |
| })($); | |
| // 加载中动画 | |
| ddb.loading = (function() { | |
| var loading = document.getElementById('ddb-loading') || $('<div id="ddb-loading"><i></i></div>').appendTo('body')[0]; | |
| return { | |
| show: function(text) { | |
| loading.style.display = 'block'; | |
| // 若带上text参数如ddb.loading.show('正在为您更换站点...') 加载接口时可以显示加载文案 | |
| if( $('#ddb-loading').html !== '<i></i>'){ | |
| $('#ddb-loading').html('<i></i>'); | |
| } | |
| if ( text ){ | |
| $('#ddb-loading').html('<span><p><i></i>' + text + '</p></span>'); | |
| } | |
| }, | |
| hide: function() { | |
| loading.style.display = 'none'; | |
| } | |
| }; | |
| })(); | |
| ddb.getChatTokenCallback = function(callback) { | |
| var userid = ddb.cookie('wx_user_id'); | |
| var key = 'chat_token_' + userid; | |
| var token = ddb.session(key); | |
| if (!userid) { | |
| return; | |
| } | |
| if (token) { | |
| callback(token); | |
| } else { | |
| ddb.get('chat/get_rongcloud_token', function(d) { | |
| if (+d.ret !== 0) { | |
| alert(d.msg); | |
| // history.back(); | |
| return; | |
| } | |
| // d.data.token = 'z/2t0IJnBZOMnLU6FSijaiueCZsiY+7I2r+QYUJmO9yhGCvu8+0H/OFeFEyKfgecaI8gKBkIlvOI3POWqG5EXw=='; | |
| if (!d.data.token) { | |
| alert('token 值为空'); | |
| return; | |
| } | |
| console.log('get token: ', token); | |
| // d.data.expire_time = +d.data.expire_time === 0 ? 9999 : d.data.expire_time; | |
| // ddb.session(key, d.data.token, {expires: d.data.expire_time, path: '/'}); | |
| ddb.session(key, d.data.token); | |
| callback(d.data.token); | |
| }); | |
| } | |
| }; | |
| // 黑色底 3 秒弹框 | |
| window.oAlert = window._alert = window.alert; | |
| window.alert = ddb.Toast.show; | |
| // 屏蔽调试方法 | |
| if (ddb.dev_status === 'release' && !B.url.getParam('debug')) { | |
| window.onerror = console.log = console.error = console.debug = console.warn = console.info = ddb.noop; | |
| } | |
| // 根据 city code 获取城市名称-依赖城市列表数据 | |
| ddb.getCityByCode = function(code, citys) { | |
| var city = ''; | |
| citys = citys || ddb.CITYS; | |
| if (!citys) { | |
| return city; | |
| } | |
| citys.some(function(item) { | |
| if (item.code == code) { | |
| city = item.city; | |
| return true; // 找到后退出循环 | |
| } | |
| }); | |
| return city; | |
| }; | |
| // app 公用数据初始化 | |
| ddb.initApp = (function initApp() { | |
| ddb.app = window.DDBApp || window.android; | |
| // function css_load_check() { | |
| // var div = document.createElement('div'); | |
| // document.body.appendChild(div); | |
| // div.className = 'css_load_tester'; | |
| // if (div.offsetWidth == 3) { | |
| // document.body.removeChild(div); // 销毁不需要的 div | |
| // } else { | |
| // //再次从dada服务器拉取 css | |
| // ddb.tl.loadCss("http://wechat.buskeji.com/webapp/css/base.css?ts=" + Math.random()); | |
| // } | |
| // }(); //立即执行 | |
| // 只在嗒嗒 app 中执行 | |
| if (ddb.isApp) { | |
| // 添加 app 标识 | |
| document.documentElement.classList.add('ddbapp'); | |
| if (ddb.isIosApp) document.documentElement.classList.add('iosapp'); | |
| // 获取并缓存公用参数(ddb.app 未初始化就取路径中参数) | |
| ddb.common = ddb.session('appCommon'); | |
| // if (!ddb.common && ddb.app) { | |
| // if (!ddb.common) { | |
| // 如果是未登录状态一直获取 | |
| if (!ddb.common || !B.user.isLogin()) { | |
| var commonParams = ddb.app ? ddb.app.getCommonParams() : ddb.cookie('ddb_app_general') || location.search.substring(1); | |
| // ddb.common = B.url.serializeArray(ddb.app.getCommonParams()); | |
| ddb.common = B.url.serializeArray(decodeURIComponent(commonParams)); | |
| // oAlert('测试 APP 通用数据:' + JSON.stringify(ddb.common)); | |
| ddb.cookie('wx_mobile', (ddb.common.mobile || ''), {path: '/'}); | |
| ddb.cookie('wx_user_id', (ddb.common.user_id || ''), {path: '/'}); | |
| ddb.cookie('wx_device_id', (ddb.common.device_id || ''), {path: '/'}); | |
| ddb.cookie('wx_ddb_token', (ddb.common.ddb_token || ''), {path: '/'}); | |
| ddb.session('appCommon', ddb.common); // 缓存公用参数 | |
| ddb.session('ddb_src_id', ddb.common.ddb_src_id || ''); | |
| ddb.store('ddbCity', ddb.getCityByCode(ddb.common.city_code) + '/' + ddb.common.city_code); // 缓存用户城市信息 | |
| // if (ddb.isApp) { | |
| // oAlert('cookie: ' + decodeURIComponent(ddb.cookie('ddb_app_general'))); | |
| // oAlert('commonParams: ' + decodeURIComponent(commonParams)); | |
| // oAlert('screen: ' + ddb.common.screen); | |
| // oAlert('device: ' + ddb.common.device_model); | |
| // } | |
| } | |
| } | |
| return initApp; | |
| })(); | |
| // ios APP 方法准备完成函数 | |
| ddb.appready = (function() { | |
| var doc = window.document; | |
| var loaded = !!window.DDBApp; | |
| var fns = [], fn; | |
| var id = setInterval(function() { | |
| if (window.DDBApp) { | |
| clearInterval(id); | |
| flush(); | |
| } | |
| }, 50); | |
| doc.addEventListener('DDBAppReady', fn = function() { | |
| doc.removeEventListener('DDBAppReady', fn); | |
| flush(); | |
| }); | |
| function flush(f) { | |
| loaded = 1; | |
| while (f = fns.shift()) { | |
| f(); | |
| } | |
| } | |
| return function(fn) { | |
| if (ddb.isApp) { | |
| loaded ? fn() : fns.push(fn); | |
| } | |
| }; | |
| }()); | |
| // ios APP 方法准备完成后初始化其方法和通用数据 | |
| // if (ddb.isIosApp) { | |
| if (ddb.isApp) { | |
| // app 方法准备完成后执行 | |
| ddb.appready(function() { | |
| ddb.app = window.DDBApp; | |
| // if ($.isEmptyObject(ddb.common)) { | |
| if (!ddb.session('appCommon')) { | |
| ddb.initApp(); | |
| } | |
| }); | |
| } | |
| // APP 方法调用函数(IOS APP 方法会在其准备好后执行) | |
| ddb.appCall = function() { | |
| if (!ddb.isApp) { | |
| return; | |
| } | |
| var fnName = arguments[0]; | |
| var args = [].slice.call(arguments, 1); | |
| ddb.appready(function() { | |
| // ddb.app[arguments[0]].apply(ddb.app, [].slice.call(arguments, 1)); | |
| // args.length ? ddb.app[fnName].apply(ddb.app, args) : ddb.app[fnName](); | |
| // ddb.app[fnName].apply(ddb.app, args); | |
| if (ddb.app[fnName]) { | |
| args.length ? ddb.app[fnName].apply(ddb.app, args) : ddb.app[fnName](); | |
| } | |
| }); | |
| }; | |
| // 微信分享设置:默认隐藏分享菜单,分享后会自动显示 | |
| // 为避免覆盖特定分享,页面加载完成才设置默认分享 | |
| ddb.wx.hideShareMenu(); | |
| $(window).on('load', function() { | |
| // 特定目录或已设置过分享 | |
| if (ddb.inPath('public|volunteer|chat') || ddb.wx.shared) { | |
| return; | |
| } | |
| ddb.wx.share({ | |
| JSSDK_Share: { | |
| title: '一人一座舒适直达,嗒嗒巴士送你上下班', | |
| desc: '上下班坐公交是玩命,坐专车是烧钱,坐嗒嗒巴士走心。', | |
| link: 'http://a.app.qq.com/o/simple.jsp?pkgname=com.newdadabus' | |
| } | |
| }); | |
| }); | |
| // 西部公汽公众号 | |
| (function() { | |
| // 判断是否是西部公汽公众号 | |
| ddb.isWesternBus = ddb.session('ddb_src_id') === 'western_bus'; | |
| // 缓存线路 ID | |
| if (ddb.isWesternBus) { | |
| var lines = B.url.getParam('western_bus_lines'); | |
| if (lines) { | |
| var lineCodes = lines.split(','); | |
| var lineIds = lineCodes.map(function(item) { | |
| return item.split('-')[0]; | |
| }); | |
| ddb.session('western_bus_line_ids', lineIds); | |
| } | |
| } | |
| // 判断是否是西部公汽线路 | |
| ddb.isWesternBusLine = function(id) { | |
| if (!ddb.isWesternBus) { | |
| return false; | |
| } | |
| var westernBusLineIds = ddb.session('western_bus_line_ids'); | |
| if (westernBusLineIds) { | |
| id = String(id).split('-')[0]; | |
| return westernBusLineIds.indexOf(id) !== -1; | |
| } | |
| return false; | |
| }; | |
| })(); | |
| // 腾讯云分析 | |
| // if (ddb.dev_status === 'dev') { | |
| if (ddb.dev_status === 'release') { | |
| // $('head').append('<script src="http://pingjs.qq.com/h5/stats.js" name="MTAH5" sid="500005024" cid="500005030"><\/script>'); | |
| (function() { | |
| var mta = document.createElement('script'); | |
| mta.src = 'http://pingjs.qq.com/h5/stats.js'; | |
| mta.setAttribute('name', 'MTAH5'); | |
| mta.setAttribute('sid', '500005024'); | |
| mta.setAttribute('cid', '500005030'); | |
| document.head.appendChild(mta); | |
| // document.body.appendChild(mta); | |
| })(); | |
| // 按钮点击统计上报 | |
| $(document).on('click', '[data-mtaid]', function() { | |
| if (!window.MtaH5) { | |
| $(document).off('click', '[data-mtaid]'); | |
| return; | |
| } | |
| var name = $.trim($(this).data('mtaid').toLowerCase()); | |
| // name = name.replace(/\s+/g, ' '); | |
| // var ddbSrcId = ddb.session('ddb_src_id'); | |
| // if (ddbSrcId) { | |
| // name += '.ddb_src_id_' + ddbSrcId; | |
| // } | |
| // console.log(name); | |
| if (name.indexOf(' ')) { | |
| name.split(' ').forEach(function(item) { | |
| // console.log(item); | |
| MtaH5.clickStat(item); | |
| }); | |
| } else if (name) { | |
| MtaH5.clickStat(name); | |
| } | |
| }); | |
| } | |
| // 搜狗 APP 本地生活 | |
| if (ddb.session('ddb_src_id') === '2128') { | |
| document.documentElement.classList.add('sogou-app'); | |
| (function() { | |
| var script = document.createElement('script'); | |
| script.src = 'http://fuwu.wap.sogou.com/static/partner.js'; | |
| script.setAttribute('sogouid', '085'); | |
| document.head.appendChild(script); | |
| // document.body.appendChild(script); | |
| })(); | |
| } | |
| // 文档加载完时执行通用代码 | |
| // $(function() { | |
| document.addEventListener('DOMContentLoaded', function() { | |
| // avalon.ready(function() { | |
| var docEl = document.documentElement; | |
| // 页面加载完成后关闭动画 | |
| var loadcover = document.getElementById('loadcover'); | |
| if (loadcover) { | |
| ddb.hideLoadcover = function() { | |
| setTimeout(function() { | |
| loadcover.className = 'hide-loadcover'; | |
| }, 300); | |
| setTimeout(function() { | |
| loadcover.parentNode.removeChild(loadcover); | |
| }, 600); | |
| }; | |
| // 设置 data-hide 属性为 none 不自动隐藏加载动画 | |
| // 须主动调用 ddb.hideLoadcover() 隐藏动画 | |
| if (loadcover.getAttribute('data-hide') !== 'none') { | |
| ddb.hideLoadcover(); | |
| } | |
| } | |
| // 导航栏返回按钮 | |
| var $navBack = $('button.newBack, .g-navbar .back'); | |
| $navBack.on('click', function() { | |
| // !document.referrer ? window.location = 'mine.html' : window.history.go(-1); | |
| window.history.go(-1); | |
| // if (!document.referrer) { | |
| // window.location = 'mine.html'; | |
| // } else { | |
| // window.history.go(-1); | |
| // } | |
| }); | |
| // 标识文档页有索引文档 | |
| $('html.doc').find('article dd:has(i)').addClass('has-index'); | |
| // 从微信推送消息等链接过来或在 app 中时,不显示导航栏的回退按钮等 | |
| if (B.url.getParam('from') === 'tplMsg' || ddb.isApp) { | |
| $navBack.not('.forced-show').hide(); | |
| } | |
| // tel、mailto 链接协议会导致安卓 app 直接挂掉,所以暂时去除(已修复) | |
| // if (ddb.isApp && $.os.android) { | |
| // $('[href^="tel:"], [href^="mailto:"]').attr('href', 'javascript:;'); | |
| // // $('[href^="tel:"], [href^="mailto:"]').removeAttr('href'); | |
| // } | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment