整理-JS篇

175 阅读1分钟

获取地址栏参数

①JavaScript 中有一个 URL 对象,通过它可以非常方便的获取 URL 中的参数。

const getParamByUrl = (key) => { 
    const url = new URL(location.href) 
    return url.searchParams.get(key) 
}

function GetQueryString(name){
    // 解决参数值乱码
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return decodeURI(r[2]); return null;
}

只在关闭浏览器时清除localStorage

window.onbeforeunload = function () { //即将离开当前页面(刷新或关闭)时执行              if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey){  
        var storage = window.localStorage;   storage.clear() 
} }

滚动到底部请求接口

    mounted(){
       window.addEventListener('scroll',this.debounce(this.handleScroll,500))
  },

  methods:{
        debounce(fn, wait) { //节流方法
             var timeout = null// 初始化定时器
                return function() {
                  if(timeout !== null)   clearTimeout(timeout);  // 如果scroll方法反复触发,则清空定时器
                  timeout = setTimeout(fn, wait);  // 如果方法没有反复触发,那么就调用我们判断滚动的方法,然后去调用数据,他就只会请求一次了
                }
         },
    handleScroll(){
        if(this.isAtBottom) return;
        let scrollTop = document.documentElement.scrollTop  // 屏幕滚动高度
        let innerHeight = document.querySelector('#app').clientHeight  // 容器高度
        let outerHeight = document.documentElement.clientHeight  // 屏幕高度
        if (outerHeight + scrollTop >= innerHeight+10) {
              // getData() 这里就可以去请求数据了
                }
           }
   },
   lazyLoading () { // 滚动到底部,再加载的处理事件
            let scrollTop = document.documentElement.scrollTop || document.body.scrollTop//网页被卷去的高
            sessionStorage.setItem("scrollTop",scrollTop)
            let clientHeight = document.documentElement.clientHeight; //网页可见区域高
            let scrollHeight = document.documentElement.scrollHeight; //网页正文全文高
            if (scrollTop + clientHeight >= (scrollHeight - 200)) { // 滚动到底部
    }},

点击div之外触发事件

<div v-clickoutside="clickoutsideDiv"></div>
methods:{
    clickoutsideDiv(){ this.show = false }
}
directives: {
    clickoutside: { // 初始化指令
      bind(el, binding, vnode) {
        function documentHandler(e) {
          // 这里判断点击的元素是否是本身,是本身,则返回
          if (el.contains(e.target)) {
            return false;
          }
          // 判断指令中是否绑定了函数
          if (binding.expression) {
           // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
            binding.value(e);
          }
        }
        // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
        el.__vueClickOutside__ = documentHandler;
        document.addEventListener('click', documentHandler);
      },
      update() {},
      unbind(el, binding) { // 解除事件监听
        document.removeEventListener('click', el.__vueClickOutside__);
        delete el.__vueClickOutside__;
      }
   }
}

watch监听query变化请求数据

watch: {
    '$route':{
        immediate: true,
        handler: function(to,form) {
        ... } } }

弹框显示组件 重新渲染

通过vue key 实现,原理[官方文档](cn.vuejs.org/v2/guide/li… 值变更时,会自动的重新渲染。

<template>
    <third-comp :key="menuKey" />
</template>

ios 火狐 日期格式兼容

('2020-01-02').replace(/-/g, "/");   //投票结束时间 ios new Date()不支持 - 连接 ('2020/01/02').replace(///g, "-");

遍历字符索引数组

for (var key in msgs) {  }

el-table全选 反选

全选this.$refs.listTalbe.toggleAllSelection()

反选this.people_list.forEach((item) => {           this.$refs.listTalbe.toggleRowSelection(item,false)})

根据参数升序

var arr = [
    {name:'zopp',age:0},
    {name:'gpp',age:18},
    {name:'yjj',age:8}
];
function compare(property){
    return function(a,b){
        var value1 = a[property];
        var value2 = b[property];
        return value1 - value2;
    }
}
console.log(arr.sort(compare('age')))

Math.random()随机数

包括下线数字(lower)不包括上限数字(upper)

Math.floor(Math.random()*(upper-lower)) + lower

包括下线数字(lower)包括上限数字(upper)

Math.floor(Math.random()*(upper-lower+1))+lower

产生随机颜色

#${Math.floor(Math.random()*0xffffff).toString(16)}

rbg(${random(0,256)},${random(0,256)},${random(0,256)})

全局filters

Object.keys(filters).forEach(key => Vue.filter(key, filters[key]))

png等格式图片转为data:image格式

            var canvas = document.createElement("canvas");
            var ctx = canvas.getContext('2d'),
            var img = new Image();
            img.src="./images/arrow05.png";
            //img.setAttribute('crossOrigin', 'anonymous')  // 图片跨域时有用
            img.onload = function(){
                canvas.height = img.height;
                canvas.width = img.width;
                ctx.drawImage(img,0,0);
                dataURL =canvas.toDataURL("image/png");
                $('#img').attr('src', dataURL);
                console.log(canvas.toDataURL("image/png"))
            };

文件流导出为excel

① method

 function exportExcel(excel, title) {
  const filename = `${title}.xlsx`; // 拼接文件名
  const blob = new Blob([excel]); //创建一个新的 Blob 对象
  const url = window.URL.createObjectURL(blob); //  把一个blob对象转化为一个Blob URL,创建下载链接
  const downloadLink = document.createElement("a"); // 生成一个a标签
  downloadLink.href = url;
  downloadLink.download = filename; // // dowload属性指定下载后文件名
  document.body.appendChild(downloadLink); //将a标签添加到body中
  downloadLink.click(); // 点击下载
  document.body.removeChild(downloadLink); // 下载完成后移除元素
  window.URL.revokeObjectURL(url); // 释放掉blob对象
}

② 设置responseType

export function ExportApi(params) {
  return request({
    ....
    responseType: "blob"
  })
}