返回顶部
首页 > 资讯 > 前端开发 > JavaScript >18个高频使用的JS工具方法总结
  • 361
分享到

18个高频使用的JS工具方法总结

2024-04-02 19:04:59 361人浏览 独家记忆
摘要

目录前言1. 回到顶部2. 删除数组指定项3. 获取 url 某一个参数4. 复制文本5. 禁止复制文本6. 复制文本带版权信息7. 判断数据类型和数据值8. ua 环境判断9. 时

前言

将自己做前端6年以来在项目中使用很高频的工具方法整理了出来,分享一下,虽然现在有很多工具类也提供了这些方法,封装的也更为完善,简单的调用一下就可以使用,但是我还是分享出来了。是希望能够知其然也知其所以然,不要只会调用 api,也要会写 api。

1. 回到顶部

较为平滑的回到顶部方案

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

2. 删除数组指定项

项目中经常会使用的工具方法,传入目标数组和目标元素,返回一个新数组。

const removeArray = (arr, item) => {
  let result = [];
  let index = -1;
  if (!(arr != null && arr.length)) {
    return result;
  }
  result = arr;
  if (Object.prototype.toString.call(item) == "[object Object]") {
    index = arr.findIndex((i) => isEqualObject(i, item));
  } else {
    index = arr.findIndex((i) => i === item);
  }
  if (index > -1) result.splice(index, 1);
  return result;
};

const isEqualObject = (obja, objb) => {
  const aProps = Object.getOwnPropertyNames(obja);
  const bProps = Object.getOwnPropertyNames(objb);
  if (aProps.length != bProps.length) {
    return false;
  }
  for (let i = 0; i < aProps.length; i++) {
    let propName = aProps[i];
    let propA = obja[propName];
    let propB = objb[propName];
    if (!objb.hasOwnProperty(propName)) return false;
    if (propA instanceof Object) {
      if (!this.isEqualObject(propA, propB)) {
        return false;
      }
    } else if (propA !== propB) {
      return false;
    }
  }
  return true;
};

removeArray([{ name: 1 }, { name: "1" }, 1, "1"], { name: "1" });

3. 获取 url 某一个参数

用于获取url传参获取参数

const getUrlParam = (key) => {
  const url = new URL(window.location.href);
  const value = url.searchParams.get(key);
  return value;
};
getUrlParam("id");

4. 复制文本

复制各种自定义的文本,浏览器兼容性高

const copyText = (text) => {
  const clipboardData = window.clipboardData;
  if (clipboardData) {
    clipboardData.clearData();
    clipboardData.setData("Text", text);
    return true;
  } else if (document.execCommand) {
    const el = document.createElement("textarea");
    el.value = text;
    el.setAttribute("readonly", "");
    el.style.position = "absolute";
    el.style.left = "-9999px";
    document.body.appendChild(el);
    el.select();
    document.execCommand("copy");
    document.body.removeChild(el);
    return true;
  }
  return false;
};
copyText("Test");

5. 禁止复制文本

body {
  user-select: none;
  -moz-user-select: none;
  -WEBkit-user-select: none;
  -ms-user-select: none;
}
// 禁止右键菜单
document.body.oncontextmenu = (e) => {
  return false;
};
// 禁止选中文字
document.body.onselectstart = (e) => {
  return false;
};
// 禁止复制
document.body.oncopy = (e) => {
  return false;
};
// 禁止剪切
document.body.oncut = (e) => {
  return false;
};
// 禁止粘贴
document.body.onpaste = (e) => {
  return false;
};

6. 复制文本带版权信息

document.body.oncopy = (event) => {
  event.preventDefault();
  const clipboardData = event.clipboardData;
  let text = window.getSelection(0).toString();
  text = `${text}\n这是插入的文本\n 作者:于五五\n`;
  if (clipboardData) {
    clipboardData.clearData();
    clipboardData.setData("Text", text);
    return true;
  } else if (document.execCommand) {
    window.clipboardData.setData("Text", text);
  }
  return false;
};

7. 判断数据类型和数据值

很常用的工具类,用于校验数据是否合法

// 是否是字符串
function isString(obj) {
  return Object.prototype.toString.call(obj) == "[object String]";
}

// 是否是数字
function isNumber(obj) {
  return (
    Object.prototype.toString.call(obj) == "[object Number]" &&
    /[\d\.]+/.test(String(obj))
  );
}

// 是否是布尔
function isBoolean(obj) {
  return Object.prototype.toString.call(obj) == "[object Boolean]";
}

// 是否是数组
function isArray(obj) {
  return Object.prototype.toString.call(obj) === "[object Array]";
}

// 是否是对象
function isObject(arg) {
  if (arg == null) {
    return false;
  } else {
    return Object.prototype.toString.call(arg) == "[object Object]";
  }
}

// 是否是方法
function isFunction(arg) {
  const type = Object.prototype.toString.call(arg);
  return type == "[object Function]" || type == "[object AsyncFunction]";
}

// 是否是时间格式
function isDate(obj) {
  return Object.prototype.toString.call(obj) == "[object Date]";
}

// 是否是时间undefined
function isUndefined(arg) {
  return arg === void 0;
}

// 是否是空对象
function isEmptyObject(arg) {
  if (isObject(arg)) {
    for (var key in arg) {
      if (Object.prototype.hasOwnProperty.call(arg, key)) {
        return false;
      }
    }
    return true;
  }
  return false;
}

8. ua 环境判断

用来区分不同平台,常用在iOS端做适配

const getUainfo = () => {
  const ua = navigator.userAgent.toLowerCase();
  const Agents = [
    "Android",
    "android",
    "iPhone",
    "SymbianOS",
    "windows Phone",
    "iPad",
    "iPod",
  ];
  let isPc = true;
  for (var i = 0; i < Agents.length; i++) {
    if (userAgentInfo.includes(Agents[i])) {
      isPc = false;
      break;
    }
  }
  return {
    // 是不是ios
    isIos:
      !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) || ua.includes("mac os x"),
    // 是不是安卓
    isAndroid:
      ua.includes("android") || ua.includes("Android") || ua.includes("Adr"),
    // 是不是微信环境
    isWeixin: ua.match(/MicroMessenger/i) == "micromessenger",
    // 是不是电脑端
    isPc: isPc,
  };
};

9. 时间格式转换

// Date转yyyy-MM-dd HH:mm:ss
const filterTimeByDate = (date, pattern = "yyyy-MM-dd HH:mm:ss") => {
  const o = {
    "M+": date.getMonth() + 1,
    "d+": date.getDate(),
    "H+": date.getHours(),
    "m+": date.getMinutes(),
    "s+": date.getSeconds(),
    "q+": Math.floor((date.getMonth() + 3) / 3),
    S: date.getMilliseconds(),
  };
  if (/(y+)/.test(pattern)) {
    pattern = pattern.replace(
      RegExp.$1,
      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  }
  for (var k in o) {
    if (new RegExp("(" + k + ")").test(pattern)) {
      pattern = pattern.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
      );
    }
  }
  return pattern;
};
filterTimeByDate(new Date());

// 时间戳转yyyy-MM-dd HH:mm:ss
const timestampToTime = (timestamp) => {
  const date = new Date(
    String(timestamp).length > 10 ? timestamp : timestamp * 1000
  ); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  const Y = date.getFullYear() + "-";
  const M =
    (date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1) + "-";
  const D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";
  const h =
    (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":";
  const m =
    (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +
    ":";
  const s =
    date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  return Y + M + D + h + m + s;
};
timestampToTime(new Date().getTime());

// yyyy-MM-dd HH:mm:ss转时间戳
const timeToTimestamp = (time, isMilli = true) => {
  const timestamp = new Date(time).getTime(); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  return isMilli ? timestamp : timestamp / 1000;
};
timeToTimestamp("2022-04-26 10:11:11");

10. 函数防抖

const debounce = (fn, delay) => {
  let timer = null;
  return function (e) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
};
document.addEventListener(
  "scroll",
  debounce(function () {
    console.log("执行");
  }, 2000)
);

11. 全屏/退出全屏

function toFullScreen() {
  let = document.documentElement;
  el.webkitRequestFullScreen
    ? el.webkitRequestFullScreen()
    : el.mozRequestFullScreen
    ? el.mozRequestFullScreen()
    : el.msRequestFullscreen
    ? el.msRequestFullscreen()
    : el.requestFullScreen
    ? el.requestFullScreen()
    : alert("当前浏览器不支持该功能");
}

function exitFullscreen() {
  let el = document;
  el.webkitCancelFullScreen
    ? el.webkitCancelFullScreen()
    : el.mozCancelFullScreen
    ? el.mozCancelFullScreen()
    : el.cancelFullScreen
    ? el.cancelFullScreen()
    : el.msExitFullscreen
    ? el.msExitFullscreen()
    : el.exitFullscreen
    ? el.exitFullscreen()
    : alert("当前浏览器不支持该功能");
}

12. 禁止打开控制台调试

用来防止部分用户通过源码攻击服务器,增加破解难度

setInterval(function () {
  check();
}, 4000);
const check = () => {
  function doCheck(a) {
    if (("" + a / a)["length"] !== 1 || a % 20 === 0) {
      (function () {}["constructor"]("debugger")());
    } else {
      (function () {}["constructor"]("debugger")());
    }
    doCheck(++a);
  }
  try {
    doCheck(0);
  } catch (err) {}
};
check();

13. 密码强度展示

const checkPwd = (str) => {
  let Lv = 0;
  if (str.length < 6) {
    return Lv;
  }
  if (/[0-9]/.test(str)) {
    Lv++;
  }
  if (/[a-z]/.test(str)) {
    Lv++;
  }
  if (/[A-Z]/.test(str)) {
    Lv++;
  }
  if (/[\.|-|_]/.test(str)) {
    Lv++;
  }
  return Lv;
};

14. 五星好评

const getRate = (rate = 0) => {
  return "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);
};
getRate(3);

15. 保留 n 位小数

const filterToFixed => (num, n = 2) {
    return parseFloat(num.toFixed(n), 10);
}

16. 金额转大写

商城项目里订单模块很常用的工具方法

const convertCurrency = (money) => {
  //汉字的数字
  const cnNums = new Array(
    "零",
    "壹",
    "贰",
    "叁",
    "肆",
    "伍",
    "陆",
    "柒",
    "捌",
    "玖"
  );
  //基本单位
  const cnIntRadice = new Array("", "拾", "佰", "仟");
  //对应整数部分扩展单位
  const cnIntUnits = new Array("", "万", "亿", "兆");
  //对应小数部分单位
  const cnDecUnits = new Array("角", "分", "毫", "厘");
  //整数金额时后面跟的字符
  const cnInteger = "整";
  //整型完以后的单位
  const cnIntLast = "元";
  //最大处理的数字
  const maxNum = 999999999999999.9999;
  //金额整数部分
  let integerNum;
  //金额小数部分
  let decimalNum;
  //输出的中文金额字符串
  let chineseStr = "";
  //分离金额后用的数组,预定义
  let parts;
  // 传入的参数为空情况
  if (money == "") {
    return "";
  }
  money = parseFloat(money);
  if (money >= maxNum) {
    return "";
  }
  // 传入的参数为0情况
  if (money == 0) {
    chineseStr = cnNums[0] + cnIntLast + cnInteger;
    return chineseStr;
  }
  // 转为字符串
  money = money.toString();
  // indexOf 检测某字符在字符串中首次出现的位置 返回索引值(从0 开始) -1 代表无
  if (money.indexOf(".") == -1) {
    integerNum = money;
    decimalNum = "";
  } else {
    parts = money.split(".");
    integerNum = parts[0];
    decimalNum = parts[1].substr(0, 4);
  }
  //转换整数部分
  if (parseInt(integerNum, 10) > 0) {
    let zeroCount = 0;
    let IntLen = integerNum.length;
    for (let i = 0; i < IntLen; i++) {
      let n = integerNum.substr(i, 1);
      let p = IntLen - i - 1;
      let q = p / 4;
      let m = p % 4;
      if (n == "0") {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          chineseStr += cnNums[0];
        }
        zeroCount = 0;
        chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
      }
      if (m == 0 && zeroCount < 4) {
        chineseStr += cnIntUnits[q];
      }
    }
    // 最后+ 元
    chineseStr += cnIntLast;
  }
  // 转换小数部分
  if (decimalNum != "") {
    let decLen = decimalNum.length;
    for (let i = 0; i < decLen; i++) {
      let n = decimalNum.substr(i, 1);
      if (n != "0") {
        chineseStr += cnNums[Number(n)] + cnDecUnits[i];
      }
    }
  }
  if (chineseStr == "") {
    chineseStr += cnNums[0] + cnIntLast + cnInteger;
  } else if (decimalNum == "") {
    chineseStr += cnInteger;
  }

  return chineseStr;
};

17. 常用正则判断

// 校验昵称为2-9位中文
const validateName = (name) => {
  const reg = /^[\u4e00-\u9fa5]{2,9}$/;
  return reg.test(name);
};

// 校验手机号
const validateMobile = (mobile) => {
  const reg = /^1[3,4,5,6,7,8,9]\d{9}$/;
  return reg.test(mobile);
};

// 校验6到18位大小写字母数字下划线组成的密码
const validatePassWord = (password) => {
  const reg = /^[a-zA-Z0-9_]{6,18}$/;
  return reg.test(password);
};

// 校验身份证号
const validateCardId = (cardId) => {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  return reg.test(cardId);
};

18. 解决运算精度丢失的问题

用来解决前端计算金额时精度丢失的问题

const calculation = {
  // 加法
  plus(arg1, arg2) {
    var r1, r2, m;
    try {
      r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return (arg1 * m + arg2 * m) / m;
  },
  //减法
  subtract(arg1, arg2) {
    var r1, r2, m, n;
    try {
      r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    n = r1 >= r2 ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
  },
  //   乘法
  multiply(arg1, arg2) {
    var m = 0,
      s1 = arg1.toString(),
      s2 = arg2.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)
    );
  },
  //   除法
  divide(arg1, arg2) {
    var t1 = 0,
      t2 = 0,
      r1,
      r2;
    try {
      t1 = arg1.toString().split(".")[1].length;
    } catch (e) {}
    try {
      t2 = arg2.toString().split(".")[1].length;
    } catch (e) {}
    r1 = Number(arg1.toString().replace(".", ""));
    r2 = Number(arg2.toString().replace(".", ""));
    return (r1 / r2) * Math.pow(10, t2 - t1);
  },
};

以上就是18个高频使用的js工具方法总结的详细内容,更多关于JS工具方法的资料请关注编程网其它相关文章!

--结束END--

本文标题: 18个高频使用的JS工具方法总结

本文链接: https://lsjlt.com/news/147637.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 18个高频使用的JS工具方法总结
    目录前言1. 回到顶部2. 删除数组指定项3. 获取 url 某一个参数4. 复制文本5. 禁止复制文本6. 复制文本带版权信息7. 判断数据类型和数据值8. ua 环境判断9. 时...
    99+
    2024-04-02
  • 高频使用的JS工具有哪些
    这篇文章主要介绍了高频使用的JS工具有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇高频使用的JS工具有哪些文章都会有所收获,下面我们一起来看看吧。1. 回到顶部较为平滑的回到顶部方案const ...
    99+
    2023-06-30
  • Python可视化最频繁使用的10大工具总结
    目录MatplotlibSeabornPlotlyBokehAltairggplotHoloviewsPlotnineWordcloudNetworkx总结今天介绍Python当中十...
    99+
    2023-03-24
    python可视化工具 python 可视化
  • 28个JS常用数组方法总结
    目录1.Array.map()2.Array.filter()3.Array.reduce()4.Array.reduceRight()5.Array.fill()6.Ar...
    99+
    2024-04-02
  • JS/CSS压缩工具的使用方法
    这篇文章主要讲解了“JS/CSS压缩工具的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS/CSS压缩工具的使用方法”吧!网页访问速度慢如何提高呢...
    99+
    2024-04-02
  • 七个非常实用的Python工具包总结
    目录一、Faker二、Pywebio三、Airflow四、Loguru五、Pydash六、Weights & Biases七、PyCaretSummary一、Faker 生产...
    99+
    2024-04-02
  • Android 开发调试工具的使用总结
     Android 调试工具,这里做一个总结整理。 DDMS --  Dalvik debug monitor service    调试监控服务 对模拟器进行相关配置。 ADB...
    99+
    2022-06-06
    调试 工具 Android
  • 16个使用最频繁的Java工具类
    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码。一、org.apache.commons.io....
    99+
    2021-02-04
    java教程 16个 Java 工具类
  • Google的代码高亮工具Syntaxhighlighter使用方法
    Google没有名为Syntaxhighlighter的官方代码高亮工具。然而,有许多第三方代码高亮工具可以在Google中使用。以...
    99+
    2023-09-27
    使用方法
  • Linux系统中dstat工具的常见用法总结
    这篇文章主要讲解了“Linux系统中dstat工具的常见用法总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统中dstat工具的常见用法总结”吧!1) 工具说明dstat是一个...
    99+
    2023-06-12
  • JS使用Promise时常见的5个错误总结
    目录1.避免 Promise 地狱2.在 Promise 中使用 try/catch 块3.在 Promise 块内使用异步函数4.在创建 Promise 后立即...
    99+
    2022-11-13
    JS Promise 错误 JS Promise Promise 错误
  • charles工具的使用方法
    本篇内容介绍了“charles工具的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. Charles 简介好多人把它叫做抓包工具,...
    99+
    2023-06-02
  • 高效工作的秘诀——Doit.im使用总结报告
    Doit.im是一款高效工作的任务管理工具,可以帮助用户更好地组织和跟踪任务,并提高工作效率。以下是我对Doit.im使用总结报告的...
    99+
    2023-09-28
    Doit.im
  • javascript的setTimeout()使用方法总结
    1、前言js的setTimeout方法用处比较多,通常用在页面刷新了、延迟执行了等等。但是很多javascript新手对setTimeout的用法还是不是很了解。虽然我学习和应用javascript已经两年多了,但是对setTimeout方...
    99+
    2022-06-07
    javascript setTimeout()用法
  • bootstrap Table的使用方法总结
    本文为大家分享了bootstrap Table的使用方法,供大家参考,具体内容如下 官网资料 效果图: 案例: html <!-- 表格 --> <table...
    99+
    2024-04-02
  • Android onCreateOptionsMenu的使用方法总结
    Android onCreateOptionsMenu的使用方法总结任何一款软件都少不了对“菜单”的使用。在Android下,每一个activity都捆绑了一个Menu,要想定义和使用菜单,都必须在Activity下进行操作,复写onCre...
    99+
    2023-05-30
    android oncreateoptionsmenu roi
  • Android WebView的使用方法总结
     Android WebView的使用方法  Android app打开H5页一般要实现如下需求:打开指定url网页;2、点击链接可以跳转到下一页,并更新标题;3、按back键或左箭头可以返回上一页;4、当webview...
    99+
    2023-05-30
    android webview roi
  • js获取对象属性值的两种方法使用总结
    场景:已知对象的某属性,我们需要获取对象中的属性值 js获取对象属性值的方法 通过 . 获取通过 [ ] 获取 let person = { ...
    99+
    2023-05-18
    js获取对象属性值的方法 js怎么取对象的属性 js获取属性
  • 汇总display使用方法来提高工作效率
    提升工作效率的display用法汇总 随着科技的不断进步和信息技术的蓬勃发展,工作方式和环境也在不断地发生变化。在现代工作中,display(显示器)已成为我们最常用的工作工具之一。一个高质量的display不仅可以提供清晰的图...
    99+
    2024-02-02
  • Python轻量级搜索工具Whoosh的使用(总结分享)
    本篇文章给大家带来了关于Python的相关知识,将为大家简单介绍一下Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码,下面一起来看一下,希望对大家有帮助。【相关推荐:Python3视频教程 】本文将简单介绍Pytho...
    99+
    2022-08-08
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作