为了方便平时的工作,在这里将一些常见的兼容函数封装起来保存,在需要的时候拿来即用。虽然当下有很多工具都帮开发者把这些事情处理得很完美了,但是我个人觉得他们是他们、我是我,我喜欢自己动手做收集一些好玩的东西,比较抵制直接伸手拿别人的成果直接来用。哈哈!
1、给一个DOM对象添加该事件类型的事件处理函数
function addEvent (ele, type, handle) { if (ele.addEventListener) { ele.addEventListener(type, handle, false); } else if (ele.attachEvent) { ele.attachEvent('on' + type, function () { handle.call(ele); }) } else { ele['on' + type] = handle; } }
2、移除DOM事件处理函数
function removeEvent (ele, type, handle) { if (ele.removeEventListener) { ele.removeEventListener(type, handle, false); } else if (ele.detachEvent) { ele.detachEvent('on' + type, handle); } else { ele['on' + type] = null; } }
3、阻止浏览器事件冒泡
function stopBubble (event) { if (event.stopPropagation) { event.stopPropagation() } else { event.cancelBubble = true; } }
4、取消浏览器默认事件
function cancelHandler (event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }
5、获取元素的最终样式值
function getStyle (ele, attr) { var res = null; if(res = ele.currentStyle) { res = ele.currentStyle[attr]; } else { res = window.getComputedStyle(ele, null)[attr]; } return parseFloat(res); }
6、生成随机颜色
function randomColor () { var str = '0123456789abcdef'; var val = '#'; for (var i = 0; i < 6; i++) { val += str[Math.floor(Math.random() * str.length)]; } return val; }
7、求出字符串中出现最多的字符,并统计出现次数
function maxChar (str) { var max = 0; var char = ''; for (var i = 0; i < str.length; i++) { var count = str.split(str[i]).length - 1; if (count > max) { max = count; char = str[i]; } else if (count == max) { if (str.split(str[i]).length - 1 == 0) { char += str[i]; } } } console.log('出现最多的字符是' + char + ',出现次数是' + max + '次。'); }
8、求出给定范围之内的质数
function prime (min, max) { var arr = []; for (var i = min; i <= max; i++) { if (i == 1) { continue; } var mark = true; for (var j = 2; j < i; j++) { if (i % j == 0) { mark = false; break; } } if (mark) { arr.push(i); } } console.log(arr); }
9、给字符串去重
function noRepeat (str) { var newStr = ''; for (var i = 0; i < str.length; i++) { for (var j = i; j < str.length; j++) { if (str[i] == str[j]) { j = ++i; } } newStr += str[i]; } console.log(newStr); }
10、数组冒泡
function bubbleSort (arr) { var temp = null; for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] > arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } console.log(arr); }
10、正则表达式处理千分符
function regThousand (str) { if (str && (typeof str === 'number' || typeof (str * 1) === 'number')) { str = String(str); var reg = /(?=(\B)(\d{3})+$)/g; var res = str.replace(reg, ','); console.log(res); } }
11、获取滚动高度
function getScrollTop () { var scrollTop = 0; if (document.documentElement && document.documentElement.scrollTop) { scrollTop = document.documentElement.scrollTop; } else if (document.body) { scrollTop = document.body.scrollTop; } return scrollTop; }
12、获取当前页面的绝对位置
function getPosition () { var postL = document.documentElement.scrollLeft || document.body.scrollLeft; var postT = document.documentElement.scrollTop || document.body.scrollTop; return {left: postL, top: postT}; }
13、原生AJAX数据交互兼容函数封装
function getData (params) { // 创建ajax对象 var xhr = undefined; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } // 配置请求参数 var urlPar = ''; if ((params.method === undefined || params.method === 'GET') && params.data) { for (var key in params.data) { urlPar += '&' + key + '=' + params.data[key]; } urlPar = '?' + urlPar.substr(1); } xhr.open(params.method === undefined ? 'GET' : params.method, params.url + urlPar, params.async === undefined ? true : params.async); // 设置请求头 if (['POST', 'PUT'].indexOf(params.method) !== -1) { xhr.setRequestHeader('Content-Type', params.contentType === undefined ? 'application/x-www-form-urlencoded' : params.contentType); } // 格式化待发送数据 if (!params.method || ['POST', 'PUT'].indexOf(params.method) !== -1 && params.data) { var postStr = ''; for (var key in params.data) { postStr += '&' + key + '=' + params.data[key]; } postStr = postStr.substr(1); xhr.send(postStr); } else { xhr.send(); } // 处理请求结果 xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200 || xhr.status === 304) { if (params.success && Object.prototype.toString.call(params.success) === '[object Function]') { params.success(JSON.parse(xhr.responseText)); } } else { if (params.error && Object.prototype.toString.call(params.error) === '[object Function]') { params.error(xhr.responseText); } } } } } // 以下是本方法的使用方法,仅对GET和POST两种请求做了示范,其它请求方式可参考具体接口说明。 // 新增数据 getData({ method: 'POST', url: 'http://127.0.0.1:9000/addContact', contentType: 'application/x-www-form-urlencoded', data: { user_name: '小笨蛋', tel: '18709345627', mail: '457455499@qq.com', address: '甘肃省庆阳市西峰区' }, success: function (res) { console.log(JSON.parse(res)); } }) // 删除数据 getData({ method: 'GET', url: 'http://127.0.0.1:9000/delContact', data: { id: '7', }, success: function (res) { console.log(JSON.parse(res)); } }) // 修改数据 getData({ method: 'POST', url: 'http://127.0.0.1:9000/updateContact', contentType: 'application/x-www-form-urlencoded', data: { id: '6', user_name: '小强强', tel: '18709340000', mail: '456455999@qq.com', address: '甘肃省庆阳市西峰区' }, success: function (res) { console.log(JSON.parse(res)); } }) // 获取数据 getData({ method: 'GET', url: 'http://127.0.0.1:9000/getContactList', success: function (res) { console.log(JSON.parse(res)); } }) // 搜索数据 getData({ method: 'GET', url: 'http://127.0.0.1:9000/searchContact', data: { user_name: '强强', }, success: function (res) { console.log(JSON.parse(res)); } })
14、获取文件的base64位码
function getStream (obj){ var fileReader = new FileReader(); var file = obj.files[0]; var stream = ''; fileReader.readAsDataURL(file); fileReader.onloadend = function(event){ var e = event || window.event; stream = e.target.result; console.log(stream); } }
16、累加字符串中mm:ss格式的时间,最终返回结果 h 小时 m 分 s 秒
function handleTime (str) { var arr = str.match(/\d\d:\d\d/g); var hour = 0; var min = 0; var sec = 0; arr.map(item => { min += item.split(':')[0] * 1; sec += item.split(':')[1] * 1; }) hour = parseInt((min + parseInt(sec / 60)) / 60); min = parseInt(min + parseInt(sec / 60)) % 60; sec = sec % 60; return '总时长为' + hour + '小时' + min + '分' + sec + '秒。'; }
17、数组去重,元素为基本类型值
function noRepeat (arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); j--; } } } return arr; }
18、数组去重,元素为引用类型值【内部有且仅有基本类型值】
function noRepeat (arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { var tag = true; for (var key in arr[i]) { if (arr[i][key] !== arr[j][key]) tag = false; } if (tag) { arr.splice(j, 1); j--; } } } return arr; }
19、数组去重排序新方法
function noRepeatSort (arr) { if (!arr || arr.constructor !== Array) return; var temp = {}; var res = []; for (var i = 0; i < arr.length; i++) { temp[arr[i]] = arr[i]; } for (var key in temp) { res.push(key * 1); } return res; }
20、在原型上封装一个 insertAfter 方法
Element.prototype.inserAfter = function (targetEle, afterEle) { var nextEle = afterEle.nextElementSibling; if (!nextEle) { this.appendChild(targetEle); } else { this.insertBefore(targetEle, nextEle); } }
21、获取可视区宽高的兼容方法
function getViewSize () { if (window.innerWidth) { return { w: window.innerWidth, h: window.inerHeight } } else { if (document.compatMode === 'BackCompat') { return { w: document.body.clientWidth, h: document.body.clientHeight } } else { return { w: document.documentElement.clientWidth, h: document.documentElement.clientHeight } } } }
22、人民币小写转大写
function digitUppercase (n) { var fraction = ['角', '分']; var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; var unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']]; var head = n < 0 ? '欠' : ''; n = Math.abs(n); var s = ''; for (var i = 0; i < fraction.length; i++) { s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); } s = s || '整'; n = Math.floor(n); for (var i = 0; i < unit[0].length && n > 0; i++) { var p = ''; for (var j = 0; j < unit[1].length && n > 0; j++) { p = digit[n % 10] + unit[1][j] + p; n = Math.floor(n / 10); } s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; } return head + s.replace(/(零.)*零元/, '元') .replace(/(零.)+/g, '零') .replace(/^整$/, '零元整'); }
23、多维数组转一维数组
function flatten(array) { return array.reduce(function (arr, item) { return (Object.prototype.toString.call(item) === '[object Array]' ? Array.prototype.push.apply(arr, flatten(item)) : arr.push(item) , arr); }, []); }
24、遍历一个对象中所有不可枚举属性
function getAttr (obj) { var temp = {}; var keys = Object.getOwnPropertyNames(obj); for (var i = 0; i < keys.length; i++) { temp[keys[i]] = obj[keys[i]]; } return temp; }
25、input输入框数字输入过滤函数,只需要绑定在oninput方法上即可
function handleInput () { var str = this.value; var confList = ['-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; var pointTimes = 0; var lineTimes = 0; var newStr = ''; for (var i = 0; i < str.length; i++) { if (confList.indexOf(str[i]) !== -1) { if (str[i] === '-' && lineTimes === 0) { lineTimes++; if (i === 0) newStr += str[i]; } if (str[i] === '.' && pointTimes === 0) { pointTimes++; if (i === 0) { newStr += '0' + str[i]; } else { newStr += str[i]; } } if (str[i] !== '-' && str[i] !== '.') { newStr += str[i]; } } } newStr = newStr.replace(/^0+/, '0'); newStr = newStr.replace(/^0+([1-9])/, '$1'); if (newStr.split('.').length === 2 && newStr.split('.')[1].length > 2) { newStr = newStr.split('.')[0] + '.' + newStr.split('.')[1].substr(0, 2); } this.value = newStr; }
26、函数防抖 ES5实现
/** * [shakeFun 防抖] * @param {[function]} callBack [回调函数] * @param {[number]} delay [延迟时间] */ function shakeFun (callBack, delay) { if (shakeFun.timer) clearTimeout(shakeFun.timer); shakeFun.timer = null; shakeFun.timer = setTimeout(function () { if (callBack && typeof callBack === 'function') { clearTimeout(shakeFun.timer); shakeFun.timer = null; callBack(); } }, delay); }
27、函数节流 ES5实现
/** * [throttleFun 节流] * @param {[function]} callBack [回调函数] * @param {[number]} delay [延迟时间] */ function throttleFun (callBack, delay) { if (throttleFun.flag) return; if (callBack && typeof callBack === 'function') { clearTimeout(throttleFun.timer); throttleFun.timer = null; throttleFun.flag = true; callBack(); } throttleFun.timer = setTimeout(function () { throttleFun.flag = false; }, delay); }
28、创建一棵虚拟DOM树
// 创建虚拟DOM结构树 function createVirtualDom (id) { var root = null; if (typeof id === 'string') { root = document.getElementById(id); } else { root = id; } var vDom = {}; vDom.node = root.nodeName.toLowerCase(); var attrs = root.attributes; for (var i = 0; i < attrs.length; i++) { var attrLab = attrs[i].name; vDom[attrLab] = root.getAttribute(attrLab); } if (root.children.length) { vDom.children = []; for (var i = 0; i < root.children.length; i++) { vDom.children.push(createVirtualDom(root.children[i])); } } else { vDom.content = root.innerText; } return vDom; }
发表评论