utils

/**
 * 是否是数字
 * @param {any} n
 */
export const validateNumber = (n: any) =>
  !isNaN(parseFloat(n)) && isFinite(n) && Number(n) === n

/**
 * 保留两位小数、千分位格式化,格式:12,345.67
 * @param {string|number} amount
 * @returns {string}
 */
export const formatAmount = (amount: any) => {
  if (!validateNumber(+amount)) {
    return amount
  }
  return (+amount).toFixed(2).replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
}



// 删除url中某个参数
const funcUrlDel = (loca, name) => {
  let baseUrl = ''
  if (loca.indexOf('&') > -1) {
    baseUrl = loca.split('?')[0] + '?'
  } else {
    baseUrl = loca.split('?')[0]
  }
  let query = loca.split('?')[1]
  if (query && query.indexOf(name) > -1) {
    var obj = {}
    var arr = query.split('&')
    for (var i = 0; i < arr.length; i++) {
      arr[i] = arr[i].split('=')
      obj[arr[i][0]] = arr[i][1]
    }
    delete obj[name]
    var url = baseUrl + JSON.stringify(obj).replace(/[\"\{\}]/g, '').replace(/\:/g, '=').replace(/\,/g, '&')
    return url
  } else {
    return loca
  }
}




/**
 * 获取Url参数中指定name的值
 * @param name 参数名称
 * @returns {string}
 */
export const getURLParam = (name: string) => {
  const re = new RegExp('(^|&)' + name + '=([^&#]*)(&|$)')
  let value = ''
  const arrHash = window.location.hash.split('?')
  const arrSearch = window.location.search.substr(1).split('?')
  arrHash.shift()
  const arr = arrSearch.concat(arrHash)

  for (let i = 0; i < arr.length; i++) {
    const r = arr[i].match(re)
    if (r !== null && r[2]) {
      value = r[2]
      break
    }
  }
  return value
}

###  延时函数
export const sleep = function(delay: number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        resolve(1)
      } catch (e) {
        reject(0)
      }
    }, delay)
  })
}
/**
 * rem 换算 px
 * @param rem 设计稿rem值
 * @returns {number} px值
 */
export const rem2px = (rem: any) => {
  const rootFontSize = parseFloat(
    window.document.documentElement.style.fontSize
  )
  return parseFloat(rem) * rootFontSize
}

平滑滚动

const scrollToTop = ()  => {
       const c = document.documentElement.scrollTop || document.body.scrollTop;
        if (c > 0) {
          window.requestAnimationFrame(scrollToTop);
          window.scrollTo(0, c - c / 8);
        }
    }

正则去掉括号

cosnt nstr = str.replace(/\([^\)]*\)/g,"")

  • js编译、解析Urlencode
1、编码
var str  = encodeURIComponent('中文');
2、解码
var str  = decodeURIComponent(UrlEncode);

替换中文逗号

    this.skuIds = this.skuIds.replace(/,/ig,',')

移动端弹窗去掉滚动条

public onShowChange(value: boolean) {
    if (value) {
      document.documentElement.style.position = 'fixed'
      document.body.style.overflow = 'hidden'
      document.body.addEventListener(
        'touchmove',
        event => {
          event.preventDefault()
        },
        false
      )
    } else {
      document.documentElement.style.position = 'static'
      document.body.style.overflow = 'auto'
      document.body.removeEventListener(
        'touchmove',
        event => {
          event.preventDefault()
        },
        false
      )
    }


### 下载
handleFileStreamExcel(res, fileName) {
      const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
      const downloadElement = document.createElement('a')
      const href = window.URL.createObjectURL(blob) // 创建下载的链接
      downloadElement.href = href
      downloadElement.download = fileName + '.xlsx' // 下载后文件名
      document.body.appendChild(downloadElement)
      downloadElement.click() // 点击下载
      document.body.removeChild(downloadElement) // 下载完成移除元素
      window.URL.revokeObjectURL(href) // 释放掉blob对象
    },
    handleFileStreamCsv(res, fileName) {
      const blob = new Blob([res], { type: 'text/csv' })
      const downloadElement = document.createElement('a')
      const href = window.URL.createObjectURL(blob) // 创建下载的链接
      downloadElement.href = href
      downloadElement.download = fileName + '.csv' // 下载后文件名
      document.body.appendChild(downloadElement)
      downloadElement.click() // 点击下载
      document.body.removeChild(downloadElement) // 下载完成移除元素
      window.URL.revokeObjectURL(href) // 释放掉blob对象
    }

兼容安卓input唤起键盘

(function (window,document) {
    document.querySelector('input[type="text"]').addEventListener('focus',function (e) {
     setTimeout(function () {
         var docHeight = window.innerHeight;
         var bottom = e.target.getBoundingClientRect().bottom
         var scrollHeight = bottom-docHeight
         if(scrollHeight>0){
             document.body.scrollTop =  scrollHeight+document.body.scrollTop+10
         }
     },400)
    },false)
})(window,document)

判断当前是安卓设备还是ios

const u = navigator.userAgent
// 安卓
export const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
// IOS
export const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)

/**

  • 兼容安卓键盘
    */
export const androidKeyboardInit = () => {
  const u = navigator.userAgent
  const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
  if (isAndroid) {
    document.querySelector('input[type="text"],input[type="password"]').addEventListener('focus', function (e) {
      setTimeout(function () {
        var docHeight = window.innerHeight
        var bottom = e.target.getBoundingClientRect().bottom
        var scrollHeight = bottom - docHeight
        if (scrollHeight > 0) {
          document.body.scrollTop = scrollHeight + document.body.scrollTop + 10
        }
      }, 400)
    }, false)
  }
}


/**
 * 兼容安卓键盘
 */
export const androidKeyboardInit = () => {
  const u = navigator.userAgent
  const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
  if (isAndroid) {
    window.addEventListener('resize', () => {
      const activeElement = document.activeElement
      if (activeElement.tagName === 'INPUT' ||
          activeElement.tagName === 'TEXTAREA') {
        setTimeout(() => {
          activeElement.scrollIntoView()
        }, 100)
      }
    })
  }
}

pc跳转移动端

if( window.location.search.indexOf("?via=")<0 &&
                ( /Android|Windows Phone|iPhone|iPod/i.test(navigator.userAgent)  || /AppleWebKit.*Mobile/i.test(navigator.userAgent) )
          ){
                try{
                    if(/Android|iPhone|Windows Phone|webOS|iPod|BlackBerry/i.test(navigator.userAgent)){
                        var referrer = document.referrer;
                        if (referrer && referrer !== "") {
                          referrer += referrer.indexOf("?") > -1 ? "&pcjump=1" : "?pcjump=1";
                        } else {
                          referrer = "none";
                        }
                        if (document.cookie) {
                          var date = new Date();
                          date.setDate(date.getDate() + 1);
                          document.cookie = "PC2MRealRef=" + escape(referrer) + ";expires=" + date.toUTCString() + "; domain=.zol.com.cn; path=/";
                        }
                        window.location.href="xxx/mobile/";
                    }
                }catch(e){}

解析excel 流文件 拦截器参数配置 responseType: 'blob'

function downLoadxlsx (excelTitle = 1, blobData = '') {
      if (!blobData) return false
      const url = window.URL.createObjectURL(new Blob([blobData], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'}))
      const link = document.createElement('a')
      link.href = url
      link.setAttribute('download', excelTitle + '.xlsx')
      document.body.appendChild(link)
      link.click()
    }

// 对象去重
    Array.prototype.unique = function (key = '') {
      const arr = this || []
      if (!arr || !arr.length) return []
      let newArr = []
      arr.forEach(item => {
        const filterLists = newArr.filter(ele => {
          return ele[key] === item[key]
        })
        if (filterLists && !filterLists.length) newArr.push(item)
      })
      return newArr
    }
// 统计数量
Array.prototype.statistics = function () {
      const _arr = this || []
      return _arr.reduce((result, item) => {
        result[item] = result.hasOwnProperty(item) ? ++result[item] : 1
        return result
      }, {})
    }
// 取最大的对象
Array.prototype.maxNum = function () {
      const _arr = this || []
      const _obj = _arr.reduce((result, item) => {
        result[item] = result.hasOwnProperty(item) ? ++result[item] : 1
        return result
      }, {})
      const key = Object.keys(_obj).find(
        item => Math.max(...Object.values(_obj)) === _obj[item]
      )
      return { label: key, num: _obj[key] }
    }


export const to = (promise) => {
  return promise
    .then(data => [data, null])
    .catch(err => [undefined, err])
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342