JS兼容及常用工具代码封装

本文目录: 1.格式化日期时间函数 2.获取对应id或者class的DOM对象 3.获取当前浏览器的类型 4.为任意一个元素绑定事件 5.为任意一个元素解绑事件 6.获取页面向上或者向左卷曲出去的距离 7.限制字符显示字数 8.ajax原生代码封装 9.比值函数 10.获取地址栏参数 11.移动端适配方案,rem快速布局 12.移动端PC端页面动态跳转解决方案 取min-max之间的随机数 14.获取传入参数的数据类型 15.深拷贝递归函数 16.让页面滚动到顶部 17.判断指定el是否在视口范围内 18.劫持粘贴板 19.将阿拉伯数字翻译成中文的大写数字 20.数组去重 21.检测密码强度 1.格式化日期时间函数 formatDates(dt),只有一个参数,默认值是当前时间对象,返回值如“2020年4月2日23:46:20” function formatDates(dt) { dt = dt || new Date() var str = ""//存储时间的字符串 //获取年 var year = dt.getFullYear() //获取月 var month = dt.getMonth() + 1 //获取日 var day = dt.getDate() //获取小时 var hour = dt.getHours() //获取分钟 var min = dt.getMinutes() //获取秒 var sec = dt.getSeconds() month = month < 10 ? "0" + month : month day = day < 10 ? "0" + day : day hour = hour < 10 ? "0" + hour : hour min = min < 10 ? "0" + min : min sec = sec < 10 ? "0" + sec : sec str = year + "年" + month + "月" + day + "日 " + hour + ":" + min + ":" + sec return str } 2.获取对应id或者class的DOM对象 如果传入的是class,则返回的是符合条件的第一个DOM元素。 function $i(id) { return document.getElementById(id) } function $c(cls) { return document.getElementsByClassName(cls)[0] } 3.获取当前浏览器的类型 在处理一些兼容性问题的形式可以根据下面的判定进行处理。 function userBrowser() { var broType = '' var browserName = navigator.userAgent.toLowerCase() if (/msie/i.test(browserName) && !/opera/.test(browserName)) { broType = "IE" } else if (/firefox/i.test(browserName)) { broType = "Firefox" } else if (/chrome/i.test(browserName) && /webkit/i.test(browserName) && /mozilla/i.test(browserName)) { broType = "Chrome" } else if (/opera/i.test(browserName)) { broType = "Opera" } else if (/webkit/i.test(browserName) && !(/chrome/i.test(browserName) && /webkit/i.test(browserName) && /mozilla/i.test(browserName))) { broType = "Safari" } else { broType = "Unknown" } return broType } 4.为任意一个元素绑定事件 三个参数:元素,事件类型,事件处理函数 当项目需要兼容到IE8及以下的时候,绑定事件可以通过下面的函数进行兼容。 function addEventListener(element, type, fn) { if (element.addEventListener) { //支持 element.addEventListener(type, fn, false) } else if (element.attachEvent) { element.attachEvent("on" + type, fn) } else { element["on" + type] = fn } } 5.为任意一个元素解绑事件 三个参数:元素,事件类型,事件处理函数 当项目需要兼容到IE8及以下的时候,解绑事件可以通过下面的函数进行兼容。 function removeEventListener(element, type, fn) { if (element.removeEventListener) { element.removeEventListener(type, fn, false) } else if (element.detachEvent) { element.detachEvent("on" + type, fn) } else { element["on" + type] = null } } 6.获取页面向上或者向左卷曲出去的距离 下面封装的函数可以实现最大兼容性的获取到想要的值,返回值是一个对象,top属性对应的向上卷曲出去的距离值,left属性对应的向左卷曲出去的距离值。 function getScroll() { return { top: window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop || 0, left: window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft || 0 } } 7.限制字符显示字数 方法需要传两个参数,第一个参数是需要传入的字符串,第二个参数是需要保留的字符串字数 function cutLongString(string, number) { var newString = '' if (string.length > number) { return newString = string.sunstring(0, number) + '...' } else { return newString } } 8.ajax原生代码封装 调用时的参数 ajax({ url: "", //请求地址 type: 'GET', //请求方式 async:true,//同步异步设置 timeout:6000,//超时设置 data: { name: '', age: '', email: '' }, //请求参数 success: function(response, xml) { console.log(response); // 此处执行请求成功后的回调 }, error: function(status) { console.log('状态码为' + status); // 此处为请求失败后的回调 } }) 代码封装 function ajax(options) { options = options || {}; options.type = (options.type || "GET").toUpperCase(); options.dataType = options.dataType || 'json'; options.async = options.async || true; options.timeout = options.timeout || 5000;//超时处理,默认5s var params = getParams(options.data); var timeoutFlag = null; var xhr; var that = this; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP') } xhr.onreadystatechange = function () { if (options.dataType === 'json') { if (xhr.readyState == 4) { window.clearTimeout(that.timeoutFlag); var status = xhr.status; if (status >= 200 && status < 300) { // 如果需要像 html 表单那样 POST 数据,请使用 setRequestHeader() 来添加 http 头。 options.success && options.success(xhr.responseText, xhr.responseXML); } else { options.error && options.error(status); } } } else { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { window.clearTimeout(that.timeoutFlag); var oScript = document.createElement('script'); document.body.appendChild(oScript); var callbackname = 'ajaxCallBack' oScript.src = options.url + "?" + params + '&callback=' + callbackname; window['ajaxCallBack'] = function (data) { options.success(data); document.body.removeChild(oScript); }; } } }; if (options.type == 'GET') { xhr.open("GET", options.url + '?' + params, options.async); xhr.send(null) } else if (options.type == 'POST') { xhr.open('POST', options.url, options.async); if (options.contentType == "undefined" || options.contentType == null) { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(params); } else { xhr.setRequestHeader('Content-Type', options.contentType); xhr.send(JSON.stringify(options.data)); } } this.timeoutFlag = window.setTimeout(function () {//计时器,超时后处理 window.clearTimeout(that.timeoutFlag); //options.error("timeout"); xhr.abort(); }.bind(this), options.timeout); } function getParams(data) { var arr = []; for (var param in data) { arr.push(encodeURIComponent(param) + '=' + encodeURIComponent(data[param])); } return arr.join('&'); } 9.比值函数 普通比值函数:直接把变量放入sort方法中即可 var compareUp = function (a, b) {//升序比值函数 if (a < b) { return -1; } else if (a > b) { return 1; } else { return 0; } } var compareDown = function (a, b) {//降序比值函数 if (a < b) { return 1; } else if (a > b) { return -1; } else { return 0; } } 排序对象数组的比值函数:参数传入要进行排序的属性名 var compareObjArr = function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop]; if (!isNaN(Number(val1)) && !isNaN(Number(val2))) { val1 = Number(val1); val2 = Number(val2); } if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } } } 10.获取地址栏参数 参数传入什么,返回的就是地址栏上对应的参数值 function getParamString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); // 构造一个含有目标参数的正则表达式对象 var r = window.location.search.substr(1).match(reg); // 匹配目标参数 if (r != null) return unescape(r[2]); return null; // 返回参数值 } 11.移动端适配方案,rem快速布局 PC端使用请将此代码注释掉 750px图,图片尺寸/100=rem尺寸 iphone调试开发,屏幕尺寸/100*2=rem尺寸 (function () { var width = document.documentElement.clientWidth; var html = document.querySelector("html"); html.style.fontSize = width / 7.5 + "px"; })(); 12.移动端PC端页面动态跳转解决方案 将此JS代码放到跳板页面的头部 function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = true; for (var v = 0; v < Agents.length; v++) { if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false; break; } } return flag; } IsPC(); if (!IsPC()) { //跳到移动端 window.location.href = ''; } else { //跳到PC端 window.location.href = ''; } 13. 取min-max之间的随机数 函数始终返回介于 min(包括)和 max(不包括)之间的随机数 函数始终返回介于 min(包括)和 max(不包括)之间的随机整数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min) ) + min; } 这个 JavaScript 函数始终返回介于 min 和 max(都包括)之间的随机整数: function getRandomPlus(min, max) { return Math.floor(Math.random() * (max - min + 1) ) + min; } 14.获取传入参数的数据类型 function gettype(o) { var s = Object.prototype.toString.call(o) var shorts = s.slice(8) return shorts.replace(shorts.slice(-1), '').toLowerCase() } 15.深拷贝递归函数 根据传递进来的参数,返回值是一个深拷贝出来的新数据 function deepCopy(obj) { var newobj = obj.constructor === Array ? [] : {}; if (typeof obj !== 'object') { return; } for (var i in obj) { newobj[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i]; } return newobj } 16.让页面滚动到顶部 scrollToTop = () => { const c = document.documentElement.scrollTop || document.body.scrollTop; if (c > 0) { window.requestAnimationFrame(scrollToTop); window.scrollTo(0, c - c / 8); } } 17.判断指定el是否在视口范围内 需要指定的el全部都在视口范围内才会返回true,只要有任何一部分不在视口范围都会返回false 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; } 18.劫持粘贴板 比如想要将类名为demo的文本内容复制到粘贴板,先获取到内容let demo = document.querySelector(".demo"),然后调用工具函数copyTextToClipboard(demo.innerText) copyTextToClipboard = (value) => { var textArea = document.createElement("textarea"); textArea.style.background = 'transparent'; textArea.value = value; document.body.appendChild(textArea); textArea.select(); try { var successful = document.execCommand('copy'); } catch (err) { console.log('Oops, unable to copy'); } document.body.removeChild(textArea); } 19.将阿拉伯数字翻译成中文的大写数字 numberToChinese = (num) => { var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"); var BB = new Array("", "十", "百", "仟", "萬", "億", "点", ""); var a = ("" + num).replace(/(^0*)/g, "").split("."), k = 0, re = ""; for (var i = a[0].length - 1; i >= 0; i--) { switch (k) { case 0: re = BB[7] + re; break; case 4: if (!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$") .test(a[0])) re = BB[4] + re; break; case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break; } if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re; if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++; } if (a.length > 1) // 加上小数部分(如果有小数部分) { re += BB[6]; for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)]; } if (re == '一十') re = "十"; if (re.match(/^一/) && re.length == 3) re = re.replace("一", ""); return re; } 20.数组去重 unique = (arr) => { if (Array.hasOwnProperty('from')) { return Array.from(new Set(arr)); } else { var n = {}, r = []; for (var i = 0; i < arr.length; i++) { if (!n[arr[i]]) { n[arr[i]] = true; r.push(arr[i]); } } return r; } } 21.检测密码强度 当返回值为0时,提示密码长度不得少于6位数 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; }

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):