window.afterClickBack = function () {
console.log('afterClickBack', location.href)
}
var vTools = {
// 公共前缀url
baseUrl: '/entnicheNew',
// 公共header
commonHeader: {
'version': 'v2.9.6'
},
errorCodeMap: {
1001: '需要重新登录',
1002: '缺失参数',
1003: '没有权限',
},
$env: {},
loadingTransition: 300,
// 传入你要获取的参数的名字
getParam: function (name) {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
var r = window.location.search.substr(1).match(reg); //获取url中'?'符后的字符串并正则匹配
var context = '';
if (r != null) context = r[2];
// 释放变量
reg = null;
r = null;
return context == null || context == '' || context == 'undefined' ? '' : context;
},
// 数组对象根据某一个值进行冒泡排序
// arr 数组
// value 字符串
bSort: function (arr, value) {
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
// 相邻元素两两对比,元素交换,大的元素交换到后面
if (arr[j][value] > arr[j + 1][value]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
},
// 格式化金钱的函数
// s: 金额(number) 必传
// n: 保留小数的位数(int:0-100)
formatMoney: function (s, n) {
if (n === undefined) {
n = -1
} else {
n = n > 0 && n <= 20 ? n : 2;
}
var intS = parseInt(s)
var point = '.'
var left;
var right;
s = parseFloat((s + '').replace(/[^\d\.-]/g, ''))
// 没传n,默认(如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
if (n === -1) {
if (s === intS) {
n = 0
right = ''
point = ''
} else {
n = 2
s = s.toFixed(n);
right = s.split('.')[1];
}
s = s + ''
left = s.split('.')[0].split('').reverse();
} else {
s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(n) + '';
left = s.split('.')[0].split('').reverse();
right = s.split('.')[1];
}
t = '';
for (i = 0; i < left.length; i++) {
t += left[i] + ((i + 1) % 3 == 0 && (i + 1) != left.length ? ',' : '');
}
var money = t.split('').reverse().join('') + point + right;
return money;
},
// 解决ios返回不刷新页面的问题
iosBackRefresh: function () {
var isPageHide = false;
window.addEventListener('pageshow', function () {
if (isPageHide) {
location.reload();
}
});
window.addEventListener('pagehide', function () {
isPageHide = true;
});
},
// 通过userAgent获取用户手机操作系统类型
androidOrIOS: function () {
var u = navigator.userAgent.toLowerCase();
var app = navigator.appVersion;
var agent = null;
if (/iphone|ipod|ipad|ios/.test(u)) {
agent = 'ios'
} else {
agent = 'android'
}
return agent
},
// 取[m, n]随机数
getRandomNumber: function (min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
},
// 获取唯一的uuid
// https://www.kancloud.cn/ifeng/js100/622666
getRandomUuid: function () {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
},
// 获取随机字符串
// 不传参数则获取长度不固定的字符串
getRandomString: function (len) {
var randomString = '';
if (len) {
/****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
var maxPos = $chars.length;
for (i = 0; i < len; i++) {
randomString += $chars.charAt(Math.floor(Math.random() * maxPos));
}
} else {
// Math.random() 生成随机数字, eg: 0.123456
// .toString(36) 转化成36进制 : "0.4fzyo82mvyr"
// .substring(2) 去掉前面两位 : "yo82mvyr"
// .slice(-8) 截取最后八位 : "yo82mvyr"
randomString = Math.random().toString(36).substring(2)
}
return randomString;
},
// FROM: https://www.jianshu.com/p/90ed8b728975
// 比较两个兑现是否相等
// 返回true为相等,返回false为不相等
deepCompare: function (x, y) {
var i, l, leftChain, rightChain;
function compare2Objects(x, y) {
var p;
// remember that NaN === NaN returns false
// and isNaN(undefined) returns true
if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
return true;
}
// Compare primitives and functions.
// Check if both arguments link to the same object.
// Especially useful on the step where we compare prototypes
if (x === y) {
return true;
}
// Works in case when functions are created in constructor.
// Comparing dates is a common scenario. Another built-ins?
// We can even handle functions passed across iframes
if ((typeof x === 'function' && typeof y === 'function') ||
(x instanceof Date && y instanceof Date) ||
(x instanceof RegExp && y instanceof RegExp) ||
(x instanceof String && y instanceof String) ||
(x instanceof Number && y instanceof Number)) {
return x.toString() === y.toString();
}
// At last checking prototypes as good as we can
if (!(x instanceof Object && y instanceof Object)) {
return false;
}
if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
return false;
}
if (x.constructor !== y.constructor) {
return false;
}
if (x.prototype !== y.prototype) {
return false;
}
// Check for infinitive linking loops
if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
return false;
}
// Quick checking of one object being a subset of another.
// todo: cache the structure of arguments[0] for performance
for (p in y) {
if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
return false;
} else if (typeof y[p] !== typeof x[p]) {
return false;
}
}
for (p in x) {
if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
return false;
} else if (typeof y[p] !== typeof x[p]) {
return false;
}
switch (typeof (x[p])) {
case 'object':
case 'function':
leftChain.push(x);
rightChain.push(y);
if (!compare2Objects(x[p], y[p])) {
return false;
}
leftChain.pop();
rightChain.pop();
break;
default:
if (x[p] !== y[p]) {
return false;
}
break;
}
}
return true;
}
if (arguments.length < 1) {
return true; //Die silently? Don't know how to handle such case, please help...
// throw "Need two or more arguments to compare";
}
for (i = 1, l = arguments.length; i < l; i++) {
leftChain = []; //Todo: this can be cached
rightChain = [];
if (!compare2Objects(arguments[0], arguments[i])) {
return false;
}
}
return true;
},
// 全局loading框
jLoading: function(options) {
// 设置options参数的默认值
options.content = options.content || 'loading...'
options.bgc = options.bgc || 'transparent'
options.icon = options.icon || 'j-loading-icon'
options.duration = options.duration || 0
// 将其拼接成width: 5rem;的形式
options.width = options.width ? 'width:' + options.width + ';' : ''
// 结构
//
var that = this
var bgcClassMap = {
transparent: '',
black: 'black'
}
var icon = options.iconHide ? '' : 'icon';
var html = ''
var _html = $(html)
$('body').append(_html)
_html.fadeIn(this.loadingTransition)
var _loading = {
_html: _html,
hide: function(callback) {
this._html.fadeOut(that.loadingTransition, function() {
this.remove()
callback && callback()
})
}
}
if (options.duration > 0) {
setTimeout(function() {
_loading.hide(options.callback)
}, options.duration)
}
return _loading
},
splitPhone: function(phone) {
return String(phone).replace(/\s/g, '').replace(/(?=(\d{4})+$)/g, ' ')
},
// https://blog.csdn.net/jacoox/article/details/80719456
// https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/129、https://segmentfault.com/a/1190000012490380
// 防抖: 其中 func 为需要进行防抖操作的函数(如发送联想请求的函数),delay 为延迟时间
debounce: function(func, delay) {
var timer = null
return function() {
var _this = this
var _arg = arguments
clearTimeout(timer)
timer = setTimeout(function() {
func.apply(_this, _arg)
}, delay)
}
},
// 节流: 其中 func 为需要进行节流操作的函数,wait为等待时间
throttle: function(func, wait) {
var lastTime = 0
return function(e) {
var now = +new Date()
if (now - lastTime > wait) {
func.apply(this, arguments)
lastTime = now
}
}
},
isWeiXinBrower: function() {
var ua = navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) == 'micromessenger') {
return true;
} else {
return false;
}
},
// 解决 客户端2.9.5 replace失效问题
locationReplace: function (url){
if(history.replaceState){
history.replaceState(null, document.title, url);
history.go(0);
}else{
location.replace(url);
}
},
iosAppFns: function () {
window.JyObjMessage = new Object()
window.JyObj = {
//清除 JyObjMessage
clearMessage:function(){
JyObjMessage = new Object();
},
//隐藏显示底部菜单栏 0:隐藏;1:显示
hiddenBottom:function(val){
JyObjMessage["hidden"]=val;
window.webkit.messageHandlers.hiddenBottom.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//刷新到指定的webview
//name 对应的值:search 搜索 subscribe 订阅 box 百宝箱 me 我的
//type 对应的值:0:当前页 1:一级页面
refreshAppointTab: function (name,type) {
JyObjMessage.name = name
JyObjMessage.type = type
window.webkit.messageHandlers.refreshAppointTab.postMessage(JyObjMessage)
JyObj.clearMessage()
},
//微信登录
loginByWeixin:function(){
window.webkit.messageHandlers.loginByWeixin.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//分享功能
share:function(type,title,content,link){
JyObjMessage["type"]=type
JyObjMessage["title"]=title
JyObjMessage["content"]=content
JyObjMessage["link"]=link
window.webkit.messageHandlers.share.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//保存用户token
saveUserToken:function(val){
JyObjMessage["token"]=val;
window.webkit.messageHandlers.saveUserToken.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//获取用户token
getUserToken:function(){
return JyObj.IosCall("getUserToken")
},
//移除用户token
removeUserToken:function(){
window.webkit.messageHandlers.removeUserToken.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//查看开关状态 是否接受消息
checkNoticePermission:function(){
return JyObj.IosCall("checkNoticePermission")
},
//打开接受消息开关
openSystemNotification:function(){
window.webkit.messageHandlers.openSystemNotification.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//获取极光推送id
getPushRid:function(){
return JyObj.IosCall("getPushRid")
},
//跳转外部链接
openExternalLink:function(url,title){
JyObjMessage["url"]=url
JyObjMessage["title"]=title
window.webkit.messageHandlers.openExternalLink.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//获取当前版本号
getVersion:function(){
return JyObj.IosCall("getVersion")
},
alert:function(content){
JyObjMessage["content"]=content
window.webkit.messageHandlers.alert.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//是否安装了微信
isInstallWeixin:function(){
return JyObj.IosCall("isInstallWeixin")
},
//登录加密
getCipherText:function(val){
JyObjMessage["phone"]=val
return JyObj.IosCall("getCipherText",JyObjMessage)
},
//刷新首页和订阅页面
checkLab:function(){
window.webkit.messageHandlers.checkLab.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//登录成功后向客户端传参
loginSuccess:function(status){
JyObjMessage["status"]=status
window.webkit.messageHandlers.loginSuccess.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//客户端登录页面点击返回 跳转到搜索首页
backUrl:function(val){
JyObjMessage["status"] = val;
window.webkit.messageHandlers.backUrl.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//清空通知栏消息
clearPushMessage:function(){
window.webkit.messageHandlers.clearPushMessage.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//隐藏小红点
hideRedSpotOnMenu:function(menu){
JyObjMessage["menu"] = menu;
window.webkit.messageHandlers.hideRedSpotOnMenu.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//显示小红点
showRedSpotOnMenu:function(menu){
JyObjMessage["menu"] = menu;
window.webkit.messageHandlers.showRedSpotOnMenu.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//微信支付
wxPay:function(order){
JyObjMessage["order"] = order;
window.webkit.messageHandlers.wxPay.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//支付宝支付
aliPay:function(order){
JyObjMessage["order"] = order;
window.webkit.messageHandlers.aliPay.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//获取原生的推送id
getOtherPushRid:function(){
return JyObj.IosCall("getOtherPushRid")
},
//获取手机型号
getPhoneBrand:function(){
return JyObj.IosCall("getPhoneBrand")
},
//获取定位
getLocation:function(){
return JyObj.IosCall("getLocation")
},
//切换菜单
chooseTab:function(indexTab){
JyObjMessage["indexTab"] = indexTab;
window.webkit.messageHandlers.chooseTab.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//打开照相机
skipCamera:function(){
window.webkit.messageHandlers.skipCamera.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//打开相册
skipAlbum:function(){
window.webkit.messageHandlers.skipAlbum.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//点击返回调用
judgeIsHidden:function(referer){
JyObjMessage["referer"] = referer;
window.webkit.messageHandlers.judgeIsHidden.postMessage(JyObjMessage);
JyObj.clearMessage();
},
//返回值 处理
IosCall: function (functionName,args){
if (args!=""&&args!=undefined){
JyObj.clearMessage();
}
var payload = {"jsName": functionName, "arguments": args};
var res = prompt(JSON.stringify(payload));
if (res!=""){
var resObj=JSON.parse(res)
var type = resObj.type
switch (type){
case "int":
return parseInt(resObj.value)
case "string":
return resObj.value
case "bool":
if(resObj.value=="true"){
return true
}
return false
default:
return ""
}
}
return ""
},
// 新打开相机方法
skipCameraWithParam: function (type) {
JyObjMessage.type = type
window.webkit.messageHandlers.skipCameraWithParam.postMessage(JyObjMessage)
JyObj.clearMessage()
},
// 新打开相册客户端方法
skipAlbumWithParam: function (type) {
JyObjMessage.type = type
window.webkit.messageHandlers.skipAlbumWithParam.postMessage(JyObjMessage)
JyObj.clearMessage()
}
}
},
// getRefer: function () {
// var recordPathSource = {
// me: {
// // 从这几个页面中来
// from: [
// '/jyapp/front/myOrder/toMyOrder'
// ],
// // 到哪里去
// to: '/jyapp/free/me'
// },
// treasure: {
// from: [
// '/page_entniche/page/add_ent/add_ent.html',
// '/page_entniche/page/user/bind_result.html',
// '/page_entniche/page/user/selected_ent.html',
// '/page_entniche/page/user/selected_ent.html',
// ],
// to: '/jyapp/jylab/index'
// }
// }
// var uri = ''
// if (window.URL) {
// uri = new URL(document.referrer)
// } else {
// var uri = document.createElement('a')
// uri.href = document.referrer
// }
// console.log(document.referrer)
// console.log(uri)
// var pathName = uri.pathname
// for (var key in recordPathSource) {
// var r = recordPathSource[key].from.indexOf(pathName)
// if (r !== -1) {
// sessionStorage.setItem('paySuccessNextStepLink', recordPathSource[key].to)
// }
// }
// }
}
vTools.$env = {
inWeiXin: vTools.isWeiXinBrower(),
platform: vTools.isWeiXinBrower() ? 'wx' : 'app',
operateSystem: vTools.androidOrIOS()
}
// iosApp全局注册内置方法
if (!vTools.$env.inWeiXin && vTools.$env.operateSystem === 'ios') {
vTools.iosAppFns()
vTools.iosBackRefresh()
}
/*
* 时间格式化函数(将时间格式化为,2019年08月12日,2019-08-12,2019/08/12的形式)
*
*
* pattern参数(想要什么格式的数据就传入什么格式的数据)
* · 'yyyy-MM-dd' ---> 输出如2019-09-20
* · 'yyyy-MM-dd hh:mm' ---> 输出如2019-09-20 08:20
* · 'yyyy-MM-dd hh:mm:ss' ---> 输出如2019-09-20 08:20:23
* · 'yyyy/MM/dd' ---> 输出如2019/09/20
* · 'yyyy年MM月dd日' ---> 输出如2019年09月20日
* · 'yyyy年MM月dd日 hh时mm分' ---> 输出如2019年09月20日 08时20分
* · 'yyyy年MM月dd日 hh时mm分ss秒' ---> 输出如2019年09月20日 08时20分23秒
* · 'yyyy年MM月dd日 hh时mm分ss秒 EE' ---> 输出如2019年09月20日 08时20分23秒 周二
* · 'yyyy年MM月dd日 hh时mm分ss秒 EEE' ---> 输出如2019年09月20日 08时20分23秒 星期二
*
* 参考: https://www.cnblogs.com/mr-wuxiansheng/p/6296646.html
*/
Date.prototype.pattern = function (fmt) {
var o = {
'y+': this.getFullYear(),
'M+': this.getMonth() + 1, //月份
'd+': this.getDate(), //日
'h+': this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时
'H+': this.getHours(), //小时
'm+': this.getMinutes(), //分
's+': this.getSeconds(), //秒
'q+': Math.floor((this.getMonth() + 3) / 3), //季度
'S': this.getMilliseconds(), //毫秒
'E+': this.getDay(), // 周
};
var week = {
'0': '日',
'1': '一',
'2': '二',
'3': '三',
'4': '四',
'5': '五',
'6': '六'
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
}
if (/(E+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '星期' : '周') : '') + week[
this.getDay() + '']);
}
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;
}