utils.js
//最好别在封装的方法里面打印消息,如果打印,可能打印的消息太多了,混淆function getScrollOffset() {//返回滚动条滚动的距离,如果没有滚动就是0if (window.pageXOffset) {//新的api支持,如果不存在走旧的apireturn {left: window.pageXOffset,//x偏移的距离top: window.pageYOffset,//y偏移的距离};} else {/*旧的api,分为标准模式,怪异模式,因为必有一方恒定为0,另一方不为0,为正常正确的值,所以可以不用判断2次,直接相加就行了,返回正常正确的值*/return {left: document.body.scrollLeft + document.documentElement.scrollLeft,top: document.body.scrollTop + document.documentElement.scrollTop,};}}function getViewportSize() {//返回可视窗口的宽高,与滚动条无关,与浏览器全屏半屏有关,与浏览器的实际大小有关,返回的是pxif (window.innerWidth) {return {width: window.innerWidth,height: window.innerHeight,};} else {//兼容模式:标准模式 怪异模式//如果怪异模式if (document.compatMode === "BackCompat") {return {width: document.body.clientWidth,height: document.body.clientHeight,};} else {//标准模式:w3c规定的兼容标椎return {width: document.documentElement.clientWidth,height: document.documentElement.clientHeight,};}}}//一共的大小, 窗口加上偏移量// getScrollOffset+getViewportSize相加function getScrollSize() {if (document.body.scrollWidth) {return {width: document.body.scrollWidth,height: document.body.scrollHeight,};} else {return {width: document.documentElement.scrollWidth,height: document.documentElement.scrollHeight,};}}//从可视窗口左上角到el元素左上角的距离,与滚动条无关//el元素function getElemDocPosition(el) {var parent = el.offsetParent,//元素在父元素中的偏移量offsetLeft = el.offsetLeft,offsetTop = el.offsetTop;while (parent) {offsetLeft += parent.offsetLeft;offsetTop += parent.offsetTop;parent = parent.offsetParent;}return {left: offsetLeft,top: offsetTop,};}// //获取元素属性// function getStyles(elem,prop){// if(window.getComputedStyle){// if(prop){// return window.getComputedStyle(elem,null)[prop];// }else{// return window.getComputedStyle(elem,null);// //没有写属性,就返回全部// }// }else{// if(prop){// return elem.currentStyle(prop);// /*如果有属性,就返回属性值,与window.getComputedStyle(elem,null)[prop]// 的结果一样,因为不同的浏览器对方法的支持程度不同*/// }// else{// return elem.currentStyle;// //返回所有// }// }// }//像top、left是左上角的距离//查找元素对应的style的值function getStyles(elem, prop) {if (window.getComputedStyle) {if (prop) {if (prop === "left" || prop === "top") {return parseInt(window.getComputedStyle(elem, null)[prop]);}return window.getComputedStyle(elem, null)[prop];} else {return window.getComputedStyle(elem, null);}} else {if (prop) {if (prop === "left" || prop === "top") {return parseInt(elem.currentStyle[prop]);}return elem.currentStyle[prop];} else {return elem.currentStyle;}}}//元素,事件类型,触发的方法function addEvent(el, type, fn) {// console.log(el);if (el.addEventListener) {//方法存在el.addEventListener(type, fn, false);} else if (el.attachEvent) {el.attachEvent("on" + type, function () {fn.call(el); //将this指向改为调用的本身});} else {el["on" + type] = fn; //相当于el.on,例子el.onclick=func}}//移除事件function removeEvent(elem, type, fn) {if (elem.addEventListener) {elem.removeEventListener(type, fn, false);} else if (elem.attachEvent) {elem.detachEvent("on" + type, fn);} else {elem["on" + type] = null;}}//阻止冒泡与捕获function cancelBubble(e) {var e = e || window.event; //因为ie8 e里面拿不到事件,事件在window.event里面if (e.stopPropagation) {e.stopPropagation();} else {e.cancelBubble = true;}}//阻止默认函数行为function preventDefaultEvent(e) {var e = e || window.event;if (e.preventDefault) {e.preventDefault();} else {e.returnValue = false;}}//整个页面,算上滚动条的获取鼠标方位function pagePos(e) {var sLeft = getScrollOffset().left,sTop = getScrollOffset().top,cLeft = document.documentElement.clientLeft || 0,cTop = document.documentElement.clientTop || 0;return {X: e.clientX + sLeft - cLeft,Y: e.clientY + sTop - cTop,};}//拖拽 封装好 以后直接调用就行了function elemDrag(elem) {var x, y;addEvent(elem, "mousedown", function (e) {// console.log('1');var e = e || window.event;// console.log(elem);x = pagePos(e).X - getStyles(elem, "left");y = pagePos(e).Y - getStyles(elem, "top");addEvent(document, "mousemove", mouseMove);addEvent(document, "mouseup", mouseUp);cancelBubble(e); //保险起见 把阻止事件放进去preventDefaultEvent(e);});function mouseMove(e) {// console.log(elem);var e = e || window.event;elem.style.top = pagePos(e).Y - y + "px";elem.style.left = pagePos(e).X - x + "px";}function mouseUp(e) {var e = e || window.event;removeEvent(document, "mousemove", mouseMove);removeEvent(document, "mouseup", mouseUp);}}//发现子元素,兼容性写法function elemChildren(node){var temp = {'length': 0,'push': Array.prototype.push,'splice': Array.prototype.splice},len = node.childNodes.length;for(var i = 0;i<len;i++){var childItem = node.childNodes[i];//得到所有节点if(childItem.nodeType === 1){//等于1是元素节点,而不是注释、文档节点temp[temp['length']] = childItem;temp['length']++;// temp.push(childItem); push方法}}return temp;}
