前端开发常用的方法封装

简介: 截取地址栏里携带的参数、时间转换工具、字符串的截取等......

1. 截取地址栏里携带的参数

/**
 * 解析地址
 * @param url
 * @param name
 * @returns {string|null}
 */
export function getQueryString(url, name) {
   
  let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  let r = ("?" + url.split("?")[1]).substr(1).match(reg);
  if (r != null) return unescape(r[2]);
  return null;
}

2.时间转换工具

/**
 * 时间戳转换工具
 * @param timestamp 时间戳
 * @returns {string} yy-mm-dd
 */
export function formatDate(timestamp) {
   
  if (!timestamp) {
   
    return "";
  }
  let date = new Date(timestamp);
  let month = date.getMonth() + 1;
  let strDate = date.getDate();
  if (month >= 1 && month <= 9) {
   
    month = "0" + month;
  }
  if (strDate >= 0 && strDate <= 9) {
   
    strDate = "0" + strDate;
  }
  let dateStr = date.getFullYear() + "-" + month + "-" + strDate;
  return dateStr;
}
/**
 * 时间戳转换工具
 * @param timestamp 毫秒时间戳
 * @returns {string} yy-mm-dd-hh-mm-ss
 */
export function formatTime(timestamp) {
   
  if (!timestamp) {
   
    return "";
  }
  let date = new Date(timestamp);
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  if (month >= 1 && month <= 9) {
   
    month = "0" + month;
  }
  let strDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
  let hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
  let min =
    date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
  let sec =
    date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  let dateStr =
    year + "-" + month + "-" + strDate + " " + hours + ":" + min + ":" + sec;
  return dateStr;
}
/**
 * 时间戳转换工具
 * @param timestamp 毫秒时间戳
 * @returns {string} yy-mm-dd-hh-mm-ss
 */
export function formatTime(timestamp) {
   
  if (!timestamp) {
   
    return "";
  }
  let date = new Date(timestamp);
  let month = date.getMonth() + 1;
  let strDate = date.getDate();
  if (month >= 1 && month <= 9) {
   
    month = "0" + month;
  }
  if (strDate >= 0 && strDate <= 9) {
   
    strDate = "0" + strDate;
  }
  let dateStr =
    date.getFullYear() +
    "-" +
    month +
    "-" +
    strDate +
    " " +
    (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) +
    ":" +
    (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +
    ":" +
    (date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds());
  return dateStr;
}
/**
 * 获取当前时间
 * @returns {string} yyyy-MM-dd格式
 */
export function newDate() {
   
  let date = new Date();
  let month = date.getMonth() + 1;
  let strDate = date.getDate();
  if (month >= 1 && month <= 9) {
   
    month = "0" + month;
  }
  if (strDate >= 0 && strDate <= 9) {
   
    strDate = "0" + strDate;
  }
  let dateStr = date.getFullYear() + "-" + month + "-" + strDate;
  return dateStr;
}
/**
 * n天前的时间
 * @param n 时间差
 * @returns {string} yyyy-MM-dd格式
 */
export function beforeDate(n) {
   
  let date = new Date().getTime();
  date = date - n * 24 * 60 * 60 * 1000;
  return formatDate(date);
}
Date.prototype.format = function (fmt) {
   
  let o = {
   
    "M+": this.getMonth() + 1, //月份
    "d+": this.getDate(), //日
    "h+": this.getHours(), //小时
    "m+": this.getMinutes(), //分
    "s+": this.getSeconds(), //秒
    "q+": Math.floor((this.getMonth() + 3) / 3), //季度
    S: this.getMilliseconds(), //毫秒
  };
  if (/(y+)/.test(fmt))
    fmt = fmt.replace(
      RegExp.$1,
      (this.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  for (let 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;
};
export default Date;

3. 字符串的截取

/**
 * 字符串截取
 * @param str 字符串
 * @param n 截至字符的下标
 * @returns {*}
 */
export function subString(str, n) {
   
  if (!n) return str;
  let sign = str.length <= n ? "" : "...";
  return str.substring(0, n) + sign;
}

4.判断当前元素是否是数组

 *
 * @param {
   constructor} value
 * @returns
 */
// 1,通过 constructor 判断
function isArray(value) {
   
  return value && typeof value == "object" && value.constructor === Array;
}
/**
 *
 * @param {instanceof} value
 * @returns
 */
//  2,通过instanceof 判断判断

function isArray(value) {
   
  return value && typeof value == "object" && value instanceof Array;
}
/**
 *
 * @param toString value
 * @returns
 */
//  3,通过 toString 判断
function isArray(value) {
   
  return (
    Array.isArray(value) ||
    (typeof value == "object" &&
      Object.prototype.toString.call(value) === "[object Array]")
  );
}

5.判断是否是对象

/**
 *
 * @param {isObject} value
 * @returns
 */
function isObject(value) {
   
  return (
    value != null &&
    typeof value === "object" &&
    Object.prototype.toString.call(value) === "[object Object]"
  );
}

6.判断浏览器环境

// 1,判断是否安卓
/**
 *
 * @returns isAndroid
 */
function isAndroid() {
   
  return (
    /Android/i.test(navigator.userAgent) || /Linux/i.test(navigator.appVersion)
  );
}
// 2,判断是否ios
/**
 *
 * @returns isIOS
 */
function isIOS() {
   
  return /ipad|iphone/i.test(navigator.userAgent);
}
// 3,判断是否是Safari
/**
 *
 * @returns isSafari
 */

function isSafari() {
   
  return /msie|applewebkit.+safari/i.test(navigator.userAgent);
}
// 4,判断是否在微信
/**
 *
 * @returns isWeixin
 */

function isWeixin() {
   
  return /MicroMessenger/i.test(navigator.userAgent);
}

7.使用promise封装ajax(对jq的ajax的封装)

/**
 *
 * @param {$ajax} config
 * @returns
 */
function $ajax(config) {
   
  return new Promise(function (resolve, reject) {
   
    $.ajax(
      $.extend({
   }, config, {
   
        success: function (data) {
   
          if (data && data.success === false) {
   
            reject(data);
          } else {
   
            resolve(data);
          }
        },
        error: function (...args) {
   
          console.error(config, ...args);
          reject(...args);
        },
      })
    );
  });
}
// 2,添加跨域的ajax
/**
 *
 * @param {ajax} config
 * @returns
 */
function ajax(config) {
   
  return new Promise(function (resolve, reject) {
   
    $.ajax(
      $.extend(
        {
   
          xhrFields: {
   
            withCredentials: true,
          },
          crossDomain: true,
        },
        config,
        {
   
          success: function (data) {
   
            if (data && data.success === false) {
   
              reject(data);
            } else {
   
              resolve(data);
            }
          },
          error: function (...args) {
   
            console.error(config, ...args);
            reject(...args);
          },
        }
      )
    );
  });
}
//对于ajax请求,我们可能直接将后续的一些业务逻辑直接写在了ajax的会调里,如果业务逻辑比较复杂,就会造成代码嵌套层级较深,不好阅读与维护。这里我们用promise对ajax进行简单的封装,这样我们将后续的业务写在then()里,可以避免‘回调地狱’的产生

8.获取滚动的高度

export const getScrollPosition = (el = window) => ({
   
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop,
});
// 33.滚动到顶部
export const scrollToTop = () => {
   
  const c = document.documentElement.scrollTop || document.body.scrollTop;
  if (c > 0) {
   
    window.requestAnimationFrame(scrollToTop);
    window.scrollTo(0, c - c / 8);
  }
};
// 是否在视口的范围内
export const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
   
  const {
    top, left, bottom, right } = el.getBoundingClientRect();
  const {
    innerHeight, innerWidth } = window;
  return partiallyVisible
    ? ((top > 0 && top < innerHeight) ||
        (bottom > 0 && bottom < innerHeight)) &&
        ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
    : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
};

9.洗牌算法随机

/**
 *
 * @param {shuffle} arr
 * @returns
 */
export const shuffle = (arr) => {
   
  let result = [],
    random;
  while (arr.length > 0) {
   
    random = Math.floor(Math.random() * arr.length);
    result.push(arr[random]);
    arr.splice(random, 1);
  }
  return result;
};

10.劫持粘贴板

export const copyTextToClipboard = (value) => {
   
  let textArea = document.createElement("textarea");
  textArea.style.background = "transparent";
  textArea.value = value;
  document.body.appendChild(textArea);
  textArea.select();
  try {
   
    let successful = document.execCommand("copy");
  } catch (err) {
   
    console.log("Oops, unable to copy");
  }
  document.body.removeChild(textArea);
};

11.判断类型集合

export const checkStr = (str, type) => {
   
  switch (type) {
   
    case "phone": //手机号码
      return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
    case "tel": //座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
    case "card": //身份证
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
    case "pwd": //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
      return /^[a-zA-Z]\w{5,17}$/.test(str);
    case "postal": //邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str);
    case "QQ": //QQ号
      return /^[1-9][0-9]{4,9}$/.test(str);
    case "email": //邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
    case "money": //金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str);
    case "URL": //网址
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(
        str
      );
    case "IP": //IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(
        str
      );
    case "date": //日期时间
      return (
        /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(
          str
        ) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
      );
    case "number": //数字
      return /^[0-9]$/.test(str);
    case "english": //英文
      return /^[a-zA-Z]+$/.test(str);
    case "chinese": //中文
      return /^[\\u4E00-\\u9FA5]+$/.test(str);
    case "lower": //小写
      return /^[a-z]+$/.test(str);
    case "upper": //大写
      return /^[A-Z]+$/.test(str);
    case "HTML": //HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
    default:
      return true;
  }
};

12.严格的身份证校验和身份证城市

export const isCardID = (sId) => {
   
  if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
   
    console.log("你输入的身份证长度或格式错误");
    return false;
  }
  //身份证城市
  let aCity = {
   
    11: "北京",
    12: "天津",
    13: "河北",
    14: "山西",
    15: "内蒙古",
    21: "辽宁",
    22: "吉林",
    23: "黑龙江",
    31: "上海",
    32: "江苏",
    33: "浙江",
    34: "安徽",
    35: "福建",
    36: "江西",
    37: "山东",
    41: "河南",
    42: "湖北",
    43: "湖南",
    44: "广东",
    45: "广西",
    46: "海南",
    50: "重庆",
    51: "四川",
    52: "贵州",
    53: "云南",
    54: "西藏",
    61: "陕西",
    62: "甘肃",
    63: "青海",
    64: "宁夏",
    65: "新疆",
    71: "台湾",
    81: "香港",
    82: "澳门",
    91: "国外",
  };
  if (!aCity[parseInt(sId.substr(0, 2))]) {
   
    console.log("你的身份证地区非法");
    return false;
  }

13.出生日期验证和身份证号码校验

let sBirthday = (
      sId.substr(6, 4) +
      "-" +
      Number(sId.substr(10, 2)) +
      "-" +
      Number(sId.substr(12, 2))
    ).replace(/-/g, "/"),
    d = new Date(sBirthday);
  if (
    sBirthday !=
    d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate()
  ) {
   
    console.log("身份证上的出生日期非法");
    return false;
  }

  // 身份证号码校验
  let sum = 0,
    weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
    codes = "10X98765432";
  for (let i = 0; i < sId.length - 1; i++) {
   
    sum += sId[i] * weights[i];
  }
  let last = codes[sum % 11]; //计算出来的最后一位身份证号码
  if (sId[sId.length - 1] != last) {
   
    console.log("你输入的身份证号非法");
    return false;
  }

  return true;
};

14.随机数范围

export const random = (min, max) => {
   
  if (arguments.length === 2) {
   
    return Math.floor(min + Math.random() * (max + 1 - min));
  } else {
   
    return null;
  }
};
目录
相关文章
|
1天前
|
前端开发 JavaScript
前端基础(九)_this基本使用、this指向判断、改变this指向的方法
本文介绍了JavaScript中this的基本使用、this指向的判断以及改变this指向的方法。
6 1
前端基础(九)_this基本使用、this指向判断、改变this指向的方法
|
1天前
|
前端开发
前端基础(十四)_隐藏元素的方法
本文介绍了几种在前端开发中隐藏元素的方法,包括使用`display:none`、`visibility:hidden`、`opacity:0`等CSS属性,并提供了相应的示例代码。此外,还提到了其他隐藏元素的技巧,如通过设置元素位置、使用`overflow`属性和`filter`属性以及`rgba`颜色值来实现元素的隐藏。
13 1
前端基础(十四)_隐藏元素的方法
|
1天前
|
前端开发
前端基础(十一)_Float浮动、清除浮动的几种方法
本文介绍了浮动的概念、属性、特性以及清除浮动的几种方法,并通过实例演示了如何使用CSS实现元素的浮动和处理浮动带来的问题。
11 3
|
22天前
|
前端开发 JavaScript
前端ES5 | js —添加元素方法
前端ES5 | js —添加元素方法
|
1月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
19 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
1月前
|
JavaScript 前端开发 开发者
JS 继承之谜:究竟有哪些神秘方法?Web 前端开发者必知的关键技巧待你揭开谜底!
【8月更文挑战第23天】JavaScript (JS) 是 Web 前端开发的关键语言,其中继承是面向对象编程的重要概念。本文探讨了 JS 中几种继承机制:原型链继承、构造函数继承及组合继承。原型链继承利用原型对象实现属性和方法的共享;构造函数继承通过在子类构造器内调用父类构造器实现私有属性的复制;组合继承结合两者优点,既支持属性共享又避免了属性被意外覆盖的风险。理解这些模式有助于开发者更高效地组织代码结构,提升程序质量。
28 1
|
27天前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
46 0
|
27天前
|
移动开发 前端开发 JavaScript
前端表单验证的完美攻略:HTML5属性与JavaScript方法的无缝对接,让你的Web应用数据输入既安全又优雅
【8月更文挑战第31天】本文介绍前端表单验证的重要性及其实现方法,利用HTML5的内置属性如`required`、`pattern`和`minlength`进行基本验证,并借助JavaScript处理复杂逻辑,如密码确认。通过示例代码详细展示了如何结合两者实现高效且友好的表单验证,同时使用CSS增强用户体验。此方法简化开发流程并提升验证效果。
28 0
|
1月前
|
存储 前端开发 开发者
Web 前端热点来袭!数组去重难题何解?快来探索这些超实用方法,引发开发者共鸣!
【8月更文挑战第23天】在Web前端开发中,去除数组中的重复项是提升数据准确性和效率的关键步骤。本文介绍了四种常用的数组去重方法:一是运用ES6的Set数据结构,通过构造Set对象并转换回数组,快速剔除重复值;二是结合for循环与`indexOf`方法,逐个检查元素是否已存在于新数组中;三是采用`forEach`循环与`includes`方法实现类似功能;四是利用`reduce`方法,以函数式编程方式完成累积检查和去重。这四种方法各有优势,可根据项目需求和环境选择使用。
46 0
|
2月前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理