获取当前页面url中请求参数
getUrlParam: function ( ) {
let search = location. search;
let _str = search && decodeURIComponent ( search. replace ( /^\?/ , '' ) ) ;
let _arr = ! _str ? [ ] : _str. split ( '&' ) ,
param = { } ;
_arr. forEach ( function ( item) {
let key = item. split ( '=' ) [ 0 ] ;
let val = item. split ( '=' ) [ 1 ] ;
param[ key] = val;
} ) ;
return param;
} ,
拼接url和参数(json)
jointUrl: function ( url, obj) {
let rangeArr = [ ] ;
if ( obj && typeof obj === 'object' ) {
if ( rangeArr. length == 0 ) {
rangeArr. push ( url)
}
/\?/g . test ( url) ? rangeArr. push ( '&' ) : rangeArr. push ( '?' ) ;
for ( let i in obj) {
if ( obj. hasOwnProperty ( i) ) {
rangeArr. push ( i)
rangeArr. push ( '=' )
rangeArr. push ( obj[ i] )
rangeArr. push ( '&' )
}
}
return rangeArr. join ( '' ) . replace ( /&$/ , '' )
} else {
return url;
}
} ,
vue中http请求(get)
get : function ( url, callback) {
if ( ! url) return toast. show ( '没有请求URL' ) ;
url = this . jointUrl ( url, {
_: ( new Date ( ) ) . getTime ( )
} ) ;
Vue. http. get ( url)
. then ( function ( response) {
let result = response. data;
if ( 0 === result. ret) {
callback && callback ( result) ;
} else {
toast. show ( '接口错误:[ret:' + result. ret + '] ' + result. msg) ;
}
} , function ( response) {
toast. show ( '服务器错误:[status:' + response. status + '] ' + response. statusText) ;
} ) ;
} ,
原生中http请求(get)
httpGet ( url, data, header = { } , timeout = 30000 ) {
return new Promise ( ( resolve, reject) => {
if ( ! url) reject ( new Error ( "缺少url" ) )
url = this . jointUrl ( url, data)
var xmlhttp = new XMLHttpRequest ( ) ;
xmlhttp. withCredentials = true ;
xmlhttp. open ( 'GET' , url, true ) ;
for ( let i in header) {
xmlhttp. setRequestHeader ( i, header[ i] ) ;
}
xmlhttp. timeout = timeout;
xmlhttp. onreadystatechange = function ( ) {
if ( xmlhttp. readyState == 4 ) {
if ( xmlhttp. status == 504 ) {
reject ( new Error ( "服务器请求超时.." ) )
xmlhttp. abort ( ) ;
} else if ( xmlhttp. status == 200 ) {
resolve ( xmlhttp. responseText) ;
} else {
reject ( new Error ( "AJAX请求失败" ) )
}
xmlhttp = null ;
}
}
xmlhttp. ontimeout = function ( ) {
reject ( new Error ( "客户端请求超时.." ) )
}
xmlhttp. send ( data) ;
} )
}
原生http请求(jsonp)
httpJson ( url, data, cbFunName, cbKey = "callback" ) {
return new Promise ( ( resolve, reject) => {
if ( ! url) reject ( new Error ( "缺少url" ) )
cbFunName = typeof cbFunName === "string" ? cbFunName : ( '_jsonp' + Math. random ( ) ) . replace ( "." , "" ) ;
data = typeof data === "object" ? data : { }
data[ cbKey] = cbFunName;
url = this . jointUrl ( url, data)
var dom = document. createElement ( 'script' ) ;
dom. src = url
var head = document. getElementsByTagName ( 'head' ) [ 0 ]
head. appendChild ( dom) ;
window[ cbFunName] = function ( data) {
head. removeChild ( dom) ;
resolve ( data) ;
} ;
} )
} ,
vue中http请求(jsonp)
jsonp: function ( url, callback) {
if ( ! url) return toast. show ( 'URL 有误' ) ;
url = this . jointUrl ( url, {
_: ( new Date ( ) ) . getTime ( )
} ) ;
Vue. http. jsonp ( url)
. then ( function ( response) {
let result = response. data;
callback && callback ( result) ;
} , function ( response) {
toast. show ( '服务器错误:[status:' + response. status + '] ' + response. statusText) ;
} ) ;
} ,
原生ajax的POST方式请求
originalPost2: function ( url, data, successCallback, failCallback, contentType) {
var xmlhttp = null ;
if ( window. XMLHttpRequest) {
xmlhttp = new XMLHttpRequest ( ) ;
}
xmlhttp. open ( "POST" , url, true ) ;
if ( contentType) {
xmlhttp. setRequestHeader ( 'Content-Type' , contentType) ;
}
xmlhttp. timeout = 30000 ;
xmlhttp. onreadystatechange = function ( ) {
if ( xmlhttp. readyState == 4 ) {
if ( xmlhttp. status == 504 ) {
console. log ( "服务器请求超时.." ) ;
typeof failCallback == 'function' && failCallback ( )
xmlhttp. abort ( ) ;
} else if ( xmlhttp. status == 200 ) {
typeof successCallback == 'function' && successCallback ( xmlhttp. responseText)
} else {
console. log ( "服务器请求失败,状态值:" + xmlhttp. status) ;
typeof failCallback == 'function' && failCallback ( )
}
xmlhttp = null ;
}
}
xmlhttp. ontimeout = function ( ) {
console. log ( "客户端请求超时.." ) ;
typeof failCallback == 'function' && failCallback ( )
}
xmlhttp. send ( data) ;
} ,
获取时间(不传参数以当前时间返回)
getFormatDate: function ( fmt = 'yyyy-MM-dd hh:mm:ss' , time = new Date ( ) ) {
var o = {
"M+" : time. getMonth ( ) + 1 ,
"d+" : time. getDate ( ) ,
"h+" : time. getHours ( ) ,
"m+" : time. getMinutes ( ) ,
"s+" : time. getSeconds ( ) ,
"q+" : Math. floor ( ( time. getMonth ( ) + 3 ) / 3 ) ,
"S" : time. getMilliseconds ( )
} ;
if ( /(y+)/ . test ( fmt) ) fmt = fmt. replace ( RegExp. $1 , ( time. 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;
} ,
cookie相关函数
getCookie: function ( name) {
var arr, reg = new RegExp ( "(^| )" + name + "=([^;]*)(;|$)" ) ;
if ( arr = document. cookie. match ( reg) )
return ( arr[ 2 ] ) ;
else
return null ;
} ,
setCookie: function ( c_name, value, expiredays) {
var exdate = new Date ( ) ;
exdate. setDate ( exdate. getDate ( ) + expiredays) ;
document. cookie = c_name + "=" + escape ( value) + ( ( expiredays == null ) ? "" : ";expires=" + exdate. toGMTString ( ) ) ;
} ,
delCookie: function ( name) {
var exp = new Date ( ) ;
exp. setTime ( exp. getTime ( ) - 1 ) ;
var cval = this . getCookie ( name) ;
if ( cval != null )
document. cookie = name + "=" + cval + ";expires=" + exp. toGMTString ( ) ;
} ,
获取图片尺寸(根据file)
getImageSize: function ( file) {
return new Promise ( function ( resolve, reject) {
let image = new Image ( ) ;
image. onload = function ( ) {
let width = image. width;
let height = image. height;
resolve ( {
width: width,
height: height,
} ) ;
}
image. onerror = function ( e) {
reject ( '获取图片宽高失败' )
}
image. src = window. URL . createObjectURL ( new Blob ( [ file] , { type: file. type} ) ) ;
} ) ;
} ,
获取图片尺寸(根据url)
getImageSizeByUrl: function ( url) {
return new Promise ( function ( resolve, reject) {
let img = new Image ( ) ;
img. src = url + '?_=' + Date. parse ( new Date ( ) ) ;
var check = function ( ) {
if ( img. width > 0 && img. height > 0 ) {
clearInterval ( set ) ;
resolve ( {
width: img. width,
height: img. height,
} ) ;
}
}
var set = setInterval ( check, 50 ) ;
} ) ;
} ,
fetch请求
promiseFetchData: function ( url) {
return new Promise ( resolve => {
fetch ( url) . then ( res => {
if ( res. ok) {
res. json ( ) . then ( data => {
if ( data. code == 200 ) {
resolve ( data. data) ;
} else {
resolve ( ERROR ) ;
}
} ) ;
} else {
resolve ( ERROR ) ;
}
} , err => {
resolve ( ERROR ) ;
} )
} ) ;
} ,
获取字符串长度(单字符算1,其他算2)
getNickLen: function ( str) {
var len = 0 ;
for ( var i = 0 ; i < str. length; i++ ) {
var c = str. charCodeAt ( i) ;
if ( ( c >= 0x0001 && c <= 0x007e ) || ( 0xff60 <= c && c <= 0xff9f ) ) {
len++ ;
}
else {
len += 2 ;
}
}
return len;
}
除法安全运算
accDiv ( num1, num2) {
var t1, t2, r1, r2;
try {
t1 = num1. toString ( ) . split ( '.' ) [ 1 ] . length;
} catch ( e ) {
t1 = 0 ;
}
try {
t2 = num2. toString ( ) . split ( "." ) [ 1 ] . length;
} catch ( e ) {
t2 = 0 ;
}
r1 = Number ( num1. toString ( ) . replace ( "." , "" ) ) ;
r2 = Number ( num2. toString ( ) . replace ( "." , "" ) ) ;
return ( r1 / r2) * Math. pow ( 10 , t2 - t1) ;
}
乘法安全运算
accMul ( num1, num2) {
var m = 0 , s1 = num1. toString ( ) , s2 = num2. toString ( ) ;
try { m += s1. split ( "." ) [ 1 ] . length } catch ( e ) { } ;
try { m += s2. split ( "." ) [ 1 ] . length } catch ( e ) { } ;
return Number ( s1. replace ( "." , "" ) ) * Number ( s2. replace ( "." , "" ) ) / Math. pow ( 10 , m) ;
}
验证特殊字符
noSpecialCharacter ( tip= '不允许有特殊字符' , regexp) {
return function ( rule, value, callback) {
return new Promise ( ( resolve, reject) => {
let reg = regexp || /[&%\*\(\)【】~`:$]/
if ( reg. test ( value) ) {
reject ( new Error ( tip) ) ;
} else {
resolve ( )
}
} )
}
}