JS学习:第二周——NO.4DOM库
DOM库封装练习
var utils = (function () { var flg = 'getComputedStyle' in window;//惰性思想的运用; function makeArray(arg) { if (flg) {//标准浏览器 return Array.prototype.slice.call(arg); } else { var ary = []; for (var i = 0; i < arg.length; i++) { ary.push(arg[i]); } return ary; } } function jsonParse(jsonStr) { return 'JSON' in window ? JSON.parse(jsonStr) : eval('(' + jsonStr + ')'); } function rnd(n, m) { n = Number(n); m = Number(m); if (isNaN(n) || isNaN(m)) { return Math.random();//当返回0-1之间的随机小数,说明参数传错了; } if (n > m) { var tmp = m; m = n; n = tmp; } return Math.round(Math.random() * (m - n) + n); } function getByClass(strClass, parent) { parent = parent || document; if (flg) { return this.makeArray(parent.getElementsByClassName(strClass)); } //对IE浏览器兼容处理; var aryClass = strClass.replace(/(^ +)|( +$)/g, '').split(/\s+/g); var nodeList = parent.getElementsByTagName('*'); var ary = []; for (var i = 0; i < nodeList.length; i++) { var cur = nodeList[i]; var bOk = true; for (var j = 0; j < aryClass.length; j++) { var reg = new RegExp('(^| +)' + aryClass[j] + '( +|$)'); if (!reg.test(cur.className)) { bOk = false; break; } } if (bOk) { ary.push(cur); } } return ary; } function hasClass(curEle, cName) { var reg = new RegExp('(^| +)' + cName + '( +|$)', 'g'); return reg.test(curEle.className); } function addClass(curEle, strClass) { var aryClass = strClass.replace(/(^ +)|( +$)/g, '').split(/\s+/g); for (var i = 0; i < aryClass.length; i++) { if (!this.hasClass(curEle, aryClass[i])) { curEle.className += ' ' + aryClass[i]; } } } function removeClass(curEle, strClass) { var aryClass = strClass.replace(/(^ +)|( +$)/g, '').split(/\s+/g); for (var i = 0; i < aryClass.length; i++) { var reg = new RegExp('(^| +)' + aryClass[i] + '( +|$)', 'g'); if (reg.test(curEle.className)) { curEle.className = curEle.className.replace(reg, ' ').replace(/(^ +)|( +$)/g, '').replace(/\s+/g, ' '); } } } function getCss(curEle, attr) { var val = null; var reg = null; if (flg) { val = getComputedStyle(curEle, false)[attr]; } else { if (attr === 'opacity') { val = curEle.currentStyle['filter'];//‘alpha(opacity=10)’; reg = /^alpha\(opacity[=:](\d+(\.\d+)?)\)$/; return reg.test(val) ? RegExp.$1 / 100 : 1; } val = curEle.currentStyle[attr]; } //如果带单位了,干掉单位; reg = /^([+-])?(\d+(\.\d+)?)(px|pt|rem|em)?$/gi; return reg.test(val) ? parseFloat(val) : val; } function setCss(curEle, attr, value) { //升级3:处理float if (attr === 'float') { curEle.style.cssFloat = value; curEle.style.styleFloat = value; return; } //升级2:处理透明度 if (attr == 'opacity') { curEle.style.opacity = value; curEle.style.filter = 'alpha(opacity=' + (value * 100) + ')'; return; } var reg = /(width|height|top|right|bottom|left|((margin|padding)(top|right|bottom|left)?))/gi; //升级1:处理单位; if (reg.test(attr)) { if (value !== 'auto' || value.toString().indexOf('%') == -1) { value = parseFloat(value) + 'px'; } } curEle.style[attr] = value; } function setGroupCss(curEle, opt) { if (Object.prototype.toString.call(opt) !== '[object Object]') return; for (var attr in opt) { this.setCss(curEle, attr, opt[attr]); } } function css(curEle) { var argTwo = arguments[1]; if (typeof argTwo === 'string') { var argThree = arguments[2]; if (argThree === undefined) {//第三个参数没有-获取 return this.getCss(curEle, argTwo); } else {//当有第三个参数-设置一个样式 this.setCss(curEle, argTwo, argThree); } } if ({}.toString.call(argTwo) === '[object Object]') { this.setGroupCss(curEle, argTwo); } } function win(attr, value) { if (value === undefined) { return document.documentElement[attr] || document.body[attr]; } document.documentElement[attr] = document.body[attr] = value; } function offset(curEle) { var l = curEle.offsetLeft; var t = curEle.offsetTop; var par = curEle.offsetParent; while (par) { if (window.navigator.userAgent.indexOf('MSIE 8') == -1) { l += par.clientLeft; t += par.clientTop; } l += par.offsetLeft; t += par.offsetTop; par = par.offsetParent; } return {left: l, top: t} } function getChildren(curEle, tagName) { var childs = curEle.childNodes;//获取所有的子节点 var ary = []; for (var i = 0; i < childs.length; i++) { var cur = childs[i]; if (cur.nodeType == 1) {//首先保证是子元素,再考虑是否过滤; if (tagName) { if (cur.tagName.toLocaleLowerCase() === tagName.toLowerCase()) { ary.push(cur); } } else { ary.push(cur) } } } return ary; } function prev(curEle) { if (flg) { return curEle.previousElementSibling; } var pre = curEle.previousSibling; while (pre && pre.nodeType !== 1) { pre = pre.previousSibling; } return pre; } function next(curEle) { if (flg) { return curEle.nextElementSibling; } var nex = curEle.nextSibling; while (nex && nex.nodeType !== 1) { nex = nex.nextSibling; } return nex; } function sibling(curEle) { var ary = []; var pre = this.prev(curEle); var nex = this.next(curEle); if (pre) ary.push(pre); if (nex) ary.push(nex); return ary; } function prevAll(curEle) { var ary = []; var pre = this.prev(curEle); while (pre) { ary.push(pre); pre = this.prev(pre); } return ary; } function nextAll(curEle) { var nex = this.next(curEle); var ary = []; while (nex) { ary.push(nex); nex = this.next(nex); } return ary; } function siblings(curEle) { var ary1 = this.prevAll(curEle); var ary2 = this.nextAll(curEle); return ary1.concat(ary2); } function firstChild(curEle) { var children = this.getChildren(curEle); return children[0]; } function lastChild(curEle) { var children = this.getChildren(curEle); return children[children.length - 1]; } function index(curEle) { return this.prevAll(curEle).length; } function appendChild(curEle, parent) { parent.appendChild(curEle); } function prependChild(curEle, parent) { var first = this.firstChild(parent); if (first) { parent.insertBefore(curEle, first); } else { parent.appendChild(curEle); } } function insertBefore(curEle, oldEle) { oldEle.parentNode.insertBefore(curEle, oldEle); } function insertAfter(curEle, oldEle) { var nex = this.next(oldEle); if (nex) { oldEle.parentNode.insertBefore(curEle, nex); } else { oldEle.parentNode.appendChild(curEle); } } return { //makeArray:类数组转数组 makeArray: makeArray, //jsonParse:把JSON格式的字符串转成JSON格式的数据(对象) jsonParse: jsonParse, //rnd:求一定范围的随机数,包含最大值; rnd: rnd, //getByClass:通过class名,可以限制范围的获取元素 getByClass: getByClass, //hasClass:判断元素身上是否有某个class名 hasClass: hasClass, //addClass:给元素批量添加出class名 addClass: addClass, //removeClass:从元素身上批量删除class名 removeClass: removeClass, //getCss:获取非行间样式 getCss: getCss, //setCss:给元素设置一个样式 setCss: setCss, //setGroupCss:给元素设置一组样式 setGroupCss: setGroupCss, //css:集获取,设置一个,设置一组为一体; css: css, //win:浏览器盒子模型的兼容处理 win: win, //offset:元素偏移量的兼容处理; offset: offset, //getChildren:获取当前元素下的所有子元素(可以通过标签名过滤子元素) getChildren: getChildren, //prev:获取当前元素的上一个哥哥元素 prev: prev, //next:获取当前元素的下一个弟弟元素 next: next, //sibling:获取当前元素的相邻元素; sibling: sibling, //prevAll:获取当前元素所有的哥哥元素 prevAll: prevAll, //nextAll:获取当前元素所有的弟弟元素 nextAll: nextAll, //siblings:获取当前元素所有的兄弟元素; siblings: siblings, //firstChild:获取当前容器下第一个子元素 firstChild: firstChild, //lastChild:获取当前容器下最后一个子元素 lastChild: lastChild, //index:当前元素的索引(当前元素排行第几); index: index, //appendChild:把新元素插入到父容器的末尾; appendChild: appendChild, //prependChild:把新元素插入到父容器的开头; prependChild: prependChild, //insertBefore:把新元素插入到指定元素的前面 insertBefore: insertBefore, //insertAfter:把新元素插入到指定元素的后面; insertAfter: insertAfter } })();