jdjm
Version:
金融移动端 - jm
636 lines (600 loc) • 23.7 kB
JavaScript
///<jscompress sourcefile="jm.js" />
/**
* @Author: Created By McChen
* @Date: 2016/5/24
* @Mail: chenjiahao@jd.com
* @Version: V0.0.0
*/
var jm = (function () {
/**============================
private
==============================*/
function pageLockHandler(e) {
e.preventDefault();
}
Function.prototype.before = function (fn) {
var self = this;
return function () {
fn.apply(this, arguments);
return self.apply(this, arguments);
};
};
Function.prototype.after = function (fn) {
var self = this;
return function () {
var ret = self.apply(this, arguments); // return Msg
fn.apply(this, arguments);
return ret;
};
};
/**============================
public
==============================*/
return {
version: "0.0.0",
timestamp: "2016/05/24",
/**=======================
方法按阿拉伯字母顺序排序
=======================**/
/**
* @function object animate by transition
* @param {Object} obj,DOM对象
* @param {String} target,transform属性
* @param {Number} time,动画周期
* @param {String} type,默认为ease-out(选填)
* @return {Object} obj,DOM对象
*/
animate: function (obj, target, time, type) {
obj.css({
"transition": time + "s",
"-webkit-transition": time + "s",
"transform": target,
"-webkit-transform": target,
"transition-timing-function": type || "ease-out",
"-webkit-transition-timing-function": type || "ease-out"
});
return obj;
},
/**
* @function send a ajax request
* @param {Object} config 配置对象(必填)
* @attr {String} url,请求地址(必填)
* @attr {Json} data,默认为空对象(选填)
* @attr {String} type,默认为get(选填)
* @attr {String} dataType,默认为json(选填)
* @return {function} callback,成功回调(必填)
* @return {function} failFn,失败回调(选填,建议填)
*/
ajax: function (config) {
$.ajax({
url: config.url,
data: config.data || {},
type: config.type || "get",
dataType: config.dataType || "json",
success: function (data) {
config.callback && config.callback(data);
},
error: function () {
config.failFn && config.failFn();
}
})
},
/**
* @function create a div
* @param {String} className
* @param {String} innerHTML
* @return {Object} DOM
*/
createDiv: function (className, innerHTML) {
var oDiv = document.createElement("div");
oDiv.className = className;
if (innerHTML) {
oDiv.innerHTML = innerHTML
}
document.body.appendChild(oDiv);
return oDiv;
},
/**
* @function template html module
* @param {String} str, html template
* @argument {Json} data, fill data
* @return {String} formatStr 填充数据后html template
*/
format: function (str) {
var pattern = /\{([\w\-_]+)\}/gm;
var arr = Array.prototype.slice.call(arguments, 1);
var args = /\{(\d+)\}/.test(str) ? arr : arr[0];
var formatStr = str.replace(pattern, function () {
return args[arguments[1]];
});
return formatStr;
},
/**
* @function format the date
* @param {Number} time(时间戳)
* @param {String} format(格式)Eg: 'yyyy-MM-dd HH:mm:ss'
*/
formatTime: function (time, format) {
var t = new Date(time);
var tf = function (i) {
return ( i < 10 ? '0' : '') + i
};
return format.replace(/yyyy|MM|dd|HH|mm|ss/g, function (a) {
switch (a) {
case 'yyyy':
return tf(t.getFullYear());
break;
case 'MM':
return tf(t.getMonth() + 1);
break;
case 'mm':
return tf(t.getMinutes());
break;
case 'dd':
return tf(t.getDate());
break;
case 'HH':
return tf(t.getHours());
break;
case 'ss':
return tf(t.getSeconds());
break;
}
})
},
/**
* @function get systemType and appType
* @return {Object}
* @use {Object}.{type}.{param} = {Boolean}
* @type systemType/appType
* @params isIos/inWx/inApp/inJdApp/inJrApp/inWyApp
*/
getBrowserInfo: function () {
var ua = navigator.userAgent.toLowerCase();
var isIos = ua.indexOf('ipad') > -1 || ua.indexOf('iphone') > -1 || false;
var mqq = ua.indexOf("_sq_") > -1 || false;
var wx = ua.indexOf('micromessenger') > -1 || false;
var jdApp = ua.indexOf('jdapp') > -1 || false;
var jrApp = ua.indexOf('jdjr') > -1 || ua.indexOf('android-async-http') > -1 || false;
var wyApp = ua.indexOf('walletclient') > -1 || false;
var jdStock = ua.indexOf("jdstock") > -1 || false;
var systemType = {
iOS: isIos,
Android: !isIos
};
var appType = {
mqq: mqq,
wx: wx,
jdApp: jdApp,
jrApp: jrApp,
wyApp: wyApp,
jdStock: jdStock
};
return {
systemType: systemType,
appType: appType
};
},
/**
* @function get cookie by name
* @return {String}
* @param {String} name
*/
getCookie: function (name) {
var nameEQ = name + "=";
var ca = document.cookie.split(";");
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == " ") c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
},
/**
* @function get the value of url string
* @param {String} name
*/
getUrlString: function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURIComponent(r[2]);
return null;
},
/**
* @function lock the screen
*/
pageLock: function () {
document.addEventListener("touchmove", pageLockHandler, false)
},
/**
* @function unlock the screen
*/
pageUnlock: function () {
document.removeEventListener("touchmove", pageLockHandler, false)
}
}
})();
///<jscompress sourcefile="jm.userDetective.js" />
/**
* @Author: Created By McChen
* @Date: 2016/5/24
* @Mail: chenjiahao@jd.com
* @Version: V1.0.0
*/
;(function (jm) {
/**============================
private
==============================*/
var browser = "default";
for (i in jm.getBrowserInfo().appType) {
if (jm.getBrowserInfo().appType[i]) {
browser = i;
}
}
if (browser == "jrApp" && window.jsBridgeV3 != undefined) {
window.jrBridge = window.jrBridge || jsBridgeV3.onReady();
} else {
window.jrBridge = null;
}
//M页登陆
function passportLogin(opts) {
if (opts.wqLogin) {
var sid = getCookie('wq_auth_token') ;
} else {
var sid = getUrlString("sid") || getUrlString("token") || getCookie("sid");
}
var toPassport = function() {
window.location.href = opts.loginUrl;
};
if (opts.haveLogin) { //强制重新登陆
toPassport();
} else {
if (sid) {
opts.trueFn && opts.trueFn(sid);
} else {
if (opts.autoLogin) {
toPassport();
} else {
opts.falseFn && opts.falseFn();
}
}
}
}
/**============================
public
==============================*/
jm.userDetective = {
isLogin: function(opts) {
var loginURL = opts.loginUrl || "//passport.m.jd.com/user/login.action?v=1&returnurl="; // 登录中间页地址
var wqLoginUrl = opts.wqLoginUrl || loginURL; // 微信手Q渠道的登录中间页
//'http://wq.jd.com/pinbind/pintokenredirect?biz=618active&url='
var returnURL = opts.returnUrl || window.location.href; //回调地址
var haveLogin = opts.haveLogin || false; //强制重新登陆一次
switch (browser) {
case "jrApp":
if (jm.getUrlString("token")) {
opts.trueFn(jm.getUrlString("token"))
} else {
if (window.jsBridgeV3) {
window.jrBridge = window.jrBridge || jsBridgeV3.onReady();
jrBridge.then(function () {
this.jsToGetResp(function (d) {
d = typeof d == 'object' ? d : JSON.parse(d);
if (d.data) {
opts.trueFn && opts.trueFn(d.data);
}
}, {type: 1, data: ''})
}).call(jrBridge);
} else {
alert("使用此方法请先引入jsBridge.js");
}
}
break;
case "wx":
passportLogin({
autoLogin: opts.autoLogin,
trueFn: opts.trueFn,
falseFn: opts.falseFn,
loginUrl: wqLoginUrl + encodeURIComponent(returnURL),
haveLogin: haveLogin,
wqLogin: opts.wqLoginUrl
});
break;
case "mqq":
passportLogin({
autoLogin: opts.autoLogin,
trueFn: opts.trueFn,
falseFn: opts.falseFn,
loginUrl: wqLoginUrl + encodeURIComponent(returnURL),
haveLogin: haveLogin,
wqLogin: opts.wqLoginUrl
});
break;
default:
passportLogin({
autoLogin: opts.autoLogin,
trueFn: opts.trueFn,
falseFn: opts.falseFn,
loginUrl: loginURL + encodeURIComponent(returnURL),
haveLogin: haveLogin
});
break;
}
},
toJrAppModule: function(opts) {
jrBridge.then(function() {
this.jsToNative({
type: opts.type,
productId: opts.proId || "",
isclose: opts.isclose || false
});
});
},
toJdStockModule: function(scheme) {
jrBridge.then(function() {
this.jsToGetResp(function(d) {
d = typeof d == "object" ? d : JSON.parse(d);
}, {
type: 21,
stockData: scheme
});
});
}
};
})(window.jm);
///<jscompress sourcefile="jm.share.js" />
/**
* @Author: Created By McChen
* @Date: 2016/5/24
* @Mail: chenjiahao@jd.com
* @Version: V0.0.0
*/
;(function (jm) {
/**============================
private
==============================*/
var browser = "default";
for(i in jm.getBrowserInfo().appType){
if (jm.getBrowserInfo().appType[i]) {
browser = i;
}
}
//金融app
if (browser == "jrApp" && window.jsBridgeV3 != undefined) {
window.jrBridge = window.jrBridge || jsBridgeV3.onReady();
}
//京东app
if (browser == "jdApp") {
var jdAppVersion = jdAppVersion = function () {
var uaArr = navigator.userAgent.toLowerCase().split(';');
return uaArr[2] ? uaArr[2].replace(/\./g, '') : ''
}();
var isJdAppGt500 = jdAppVersion >= 500
}
//各个渠道的分享方法
var shareFn = {
wxShare: function (opts) {
var onBridgeReady = function () {
// 发送给好友;
WeixinJSBridge.on('menu:share:appmessage', function (argv) {
WeixinJSBridge.invoke('sendAppMessage', {
"appid": opts.appId,
"img_url": opts.imgUrl,
"link": opts.link,
"desc": opts.desc,
"title": opts.title
}, function (res) {
opts.shareSuccess && opts.shareSuccess();
});
});
// 分享到朋友圈;
WeixinJSBridge.on('menu:share:timeline', function (argv) {
WeixinJSBridge.invoke('shareTimeline', {
"img_url": opts.imgUrl,
"link": opts.link,
"desc": opts.desc,
"title": opts.title
}, function (res) {
opts.shareSuccess && opts.shareSuccess();
});
});
};
if (typeof WeixinJSBridge == "object") {
onBridgeReady();
} else {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}
},
jrShare: function (opts) {
if (window.jsBridgeV3) {
window.jrBridge = window.jrBridge || jsBridgeV3.onReady();
jrBridge.then(function () {
this.jsToNaWeiXin({
isShow: true, //true 显示btn,false 隐藏btn,默认隐藏
optionType: 1, //1:分享,2:连接跳转类型,3:跳原生模块
btnText: '分享', //原生按钮显示的文字
shareDate: { //optionType=1时候传递,分享信息
appId: '', //微信公共号id,可选填
img: opts.imgUrl, //分享图标
link: opts.link, //分享连接地址
desc: opts.desc, //分享描述
title: opts.title, //分享标题
friendesc: opts.title, //分享朋友圈的文字内容
type: "" //需要回调时候传递,这个type值,杨国亮给,有则传这个值,没有,type 都不要传
}
});
})
}
},
jdShare: function (opts) {
try {
if (!jm.getBrowserInfo().systemType.iOS) { //安卓
// 仅当 shareHelper对象存在时才能下发分享配置,更老版本不支持;未来如果该对象删除了也不出错
if (window.shareHelper) {
// jdApp 5.0版本新增方法
if (typeof shareHelper.initShare === 'function') {
/**
* channel 参数可设置,配置后,分享面板仅出现配置过的项目; 如果为空,则显示默认全部
*/
shareHelper.initShare(JSON.stringify({
"title": opts.title,
"content": opts.desc,
"shareUrl": opts.link,
"iconUrl": opts.imgUrl,
"shareActionType": "S",
"channel": "",
"callback": "N",
"eventId": ""
}));
}
else if (typeof shareHelper.setShareInfo === 'function') {
shareHelper.setShareInfo(opts.title, opts.desc, opts.link, opts.imgUrl)
}
}
} else if (jm.getBrowserInfo().systemType.iOS) {
var link;
// jdApp 5.0及以上版本
if (isJdAppGt500) {
jsonObj = {
category: "jump",
des: "share",
type: "111",
title: opts.title,
content: opts.desc,
shareUrl: opts.link,
//分享的图片url,自定义, V 5.0 之前,使用该字段下发分享icon url
imageUrl: opts.imgUrl,
//分享的图片url,自定义,V 5.0 之后,使用该字段下发分享 icon url
iconUrl: opts.imgUrl,
channel: "",
isCallBack: "N",
shareActionType: "S"
}
link = 'openApp.jdmobile://virtual?params=' + JSON.stringify(jsonObj);
} else {
// 包括 jdApp5.0以下,以及非 jdApp
link = 'openapp.jdmobile://communication?params={' +
'"action":"syncShareData",' +
'"title":"' + opts.title + '",' +
'"content":"' + opts.desc + '",' +
'"shareUrl":"' + opts.link + '",' +
'"iconUrl":"' + opts.imgUrl + '",' +
'"isCallBack":"N"' +
'}';
}
location.href = link;
}
} catch (e) {
}
},
sqShare: function (opts) {
var siv = setInterval(function () {
if (typeof(mqq) != "undefined" && typeof(mqq.ui) != "undefined") {
mqq.ui.setActionButton({
iconID: 4,
callback: function () {
mqq.ui.showShareMenu();
}
});
mqq.ui.setOnShareHandler(function (type) {
if (typeof(type) == "undefined")mqq.ui.showShareMenu();
else {
mqq.ui.shareMessage(
{
title: opts.title,
desc: opts.desc,
share_type: type,
image_url: opts.imgUrl
}
);
}
});
clearInterval(siv);
} else {
arguments.callee.call(this);
}
}, 500);
},
wyShare: function(opts) {
window.walletShare = function() {
jdp.shareUrl({
url: opts.link,
title: opts.title,
desc: opts.desc,
channel: "WX|QQ",
callback: function(status) {}
});
};
if (jm.getBrowserInfo().systemType.iOS) {
var timer = setInterval(function() {
if (window.WebViewJavascriptBridge) {
jdp.setMenu([ {
menuTitle: "分享",
menuAction: "walletShare"
} ]);
clearInterval(timer);
}
}, 100);
} else {
jdp.setMenu([ {
menuTitle: "分享",
menuAction: "walletShare"
} ]);
}
}
};
/**============================
public
==============================*/
jm.share = {
setShare: function (opts) {
switch (browser) {
case "wx": //微信里
shareFn.wxShare(opts);
break;
case "jrApp":
shareFn.jrShare(opts);
break;
case "jdApp":
shareFn.jdShare(opts);
break;
case "mqq":
shareFn.sqShare(opts);
break;
case "wyApp":
shareFn.wyShare(opts);
break;
}
}
}
})(window.jm);
///<jscompress sourcefile="jm.export.js" />
/**
* @Author: Created By McChen
* @Date: 2016/5/25
* @Mail: chenjiahao@jd.com
* @Version: V1.0.0
*/
;(function (jm) {
for(i in jm){
if(typeof (jm[i]) == "object"){
for(j in jm[i]){
if(typeof (window[j])=="undefined"){
window[j] = jm[i][j];
}
}
}
}
if (typeof define == "function" && seajs != undefined) {
define(function (require, exports, module) {
module.exports = jm;
})
} else {
window.jm == "undefined" && (window.jm = jm);
}
})(window.jm);