工具类function

117 阅读1分钟
/**
    获取url携带的参数
    @param url 链接
    @param name 需要获取的参数名
**/
export function getUrlKey(url = "", name) {
  let val = decodeURIComponent(
    (new RegExp("[?|&]" + name + "=" + "([^&;]+?)(&|#|;|$)").exec(url) || [
      ,
      "",
    ])[1].replace(/\+/g, "%20")
  );
  if (val == "null" || val == "undefined") {
    val = null;
  }
  return val || null;
}

/**
    获取url携带的所有参数
    @param url 链接
**/
export function getUrlParams(url) {
  let urlStr = url.split("?")[1] || "";
  let obj = {};
  let paramsArr = urlStr.split("&");
  for (let i = 0, len = paramsArr.length; i < len; i++) {
    let arr = paramsArr[i].split("=");
    obj[arr[0]] = arr[1];
  }
  return obj;
}

/**
    将url的一个值替换成另一个
    url: 页面地址+拼接参数
    key:需要被替换值的参数
    value:要替换成的值
**/
export function replaceParams(url, key, value) {
  // startIndex是key的起始index+key本身的长度+1(=的长度)
  const startIndex = url.indexOf(key) + 1 + key.length;
  const endIndex = url.indexOf("&", startIndex);
  let str = "";
  if (url.indexOf(key) == -1) {
    // 1. url里面不包含key
    if (url.indexOf("?") == -1) {
      // 1.1 url里面没有问号,说明是第一个参数,用?拼接
      str = url + `?${key}=${value}`;
    } else {
      // 1.2 url里面有问号,用&拼接
      str = url + `&${key}=${value}`;
    }
  } else if (endIndex == -1) {
    // 2. key是url的最后一个参数
    str = url.substring(0, startIndex) + value;
  } else {
    // 3. key不是url的最后一个参数
    str = url.substring(0, startIndex) + value + url.substring(endIndex);
  }
  return str || "";
}

/**
 * 函数节流
 * @param fn
 * @param wait
 * @returns {Function}
 * @constructor
 */
const throttle = (fn, wait) => {
  var timer = null
  return function() {
    var context = this
    var args = arguments
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args)
        timer = null
      }, wait)
    }
  }
}

/**
 * 防抖
 * @param fn
 * @param wait
 * @returns {Function}
 * @constructor
 */
const debounce = (fn, t) => {
  const delay = t || 300
  let timer
  return function() {
    const args = arguments
    if (timer) {
      clearTimeout(timer)
    }
    const callNow = !timer
    timer = setTimeout(() => {
      timer = null
    }, delay)
    if (callNow) fn.apply(this, args)
  }
}

/**
 * 判断当前是小程序还是h5,做相应处理
 * @param handelMiniApp 小程序环境执行的操作
 * @param handelH5 h5环境执行的操作
 **/
export function handelBySurroundings(handelMiniApp, handelH5) {
  const ua = navigator.userAgent.toLowerCase();
  if (ua.match(/MicroMessenger/i) == "micromessenger") {
    //ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器)
    wx.miniProgram.getEnv((res) => {
      if (res.miniprogram) {
        // 小程序环境
        handelMiniApp();
      } else {
        handelH5();
      }
    });
  } else if (navigator.userAgent.indexOf("AliApp") > -1) {
    handelMiniApp();
  } else {
    handelH5();
  }
}