utils.js

    1. //最好别在封装的方法里面打印消息,如果打印,可能打印的消息太多了,混淆
    2. function getScrollOffset() {
    3. //返回滚动条滚动的距离,如果没有滚动就是0
    4. if (window.pageXOffset) {
    5. //新的api支持,如果不存在走旧的api
    6. return {
    7. left: window.pageXOffset,//x偏移的距离
    8. top: window.pageYOffset,//y偏移的距离
    9. };
    10. } else {
    11. /*旧的api,分为标准模式,怪异模式,因为必有一方恒定为0,另一方不为0,
    12. 为正常正确的值,所以可以不用判断2次,直接相加就行了,返回正常正确的值
    13. */
    14. return {
    15. left: document.body.scrollLeft + document.documentElement.scrollLeft,
    16. top: document.body.scrollTop + document.documentElement.scrollTop,
    17. };
    18. }
    19. }
    20. function getViewportSize() {
    21. //返回可视窗口的宽高,与滚动条无关,与浏览器全屏半屏有关,与浏览器的实际大小有关,返回的是px
    22. if (window.innerWidth) {
    23. return {
    24. width: window.innerWidth,
    25. height: window.innerHeight,
    26. };
    27. } else {
    28. //兼容模式:标准模式 怪异模式
    29. //如果怪异模式
    30. if (document.compatMode === "BackCompat") {
    31. return {
    32. width: document.body.clientWidth,
    33. height: document.body.clientHeight,
    34. };
    35. } else {
    36. //标准模式:w3c规定的兼容标椎
    37. return {
    38. width: document.documentElement.clientWidth,
    39. height: document.documentElement.clientHeight,
    40. };
    41. }
    42. }
    43. }
    44. //一共的大小, 窗口加上偏移量
    45. // getScrollOffset+getViewportSize相加
    46. function getScrollSize() {
    47. if (document.body.scrollWidth) {
    48. return {
    49. width: document.body.scrollWidth,
    50. height: document.body.scrollHeight,
    51. };
    52. } else {
    53. return {
    54. width: document.documentElement.scrollWidth,
    55. height: document.documentElement.scrollHeight,
    56. };
    57. }
    58. }
    59. //从可视窗口左上角到el元素左上角的距离,与滚动条无关
    60. //el元素
    61. function getElemDocPosition(el) {
    62. var parent = el.offsetParent,//元素在父元素中的偏移量
    63. offsetLeft = el.offsetLeft,
    64. offsetTop = el.offsetTop;
    65. while (parent) {
    66. offsetLeft += parent.offsetLeft;
    67. offsetTop += parent.offsetTop;
    68. parent = parent.offsetParent;
    69. }
    70. return {
    71. left: offsetLeft,
    72. top: offsetTop,
    73. };
    74. }
    75. // //获取元素属性
    76. // function getStyles(elem,prop){
    77. // if(window.getComputedStyle){
    78. // if(prop){
    79. // return window.getComputedStyle(elem,null)[prop];
    80. // }else{
    81. // return window.getComputedStyle(elem,null);
    82. // //没有写属性,就返回全部
    83. // }
    84. // }else{
    85. // if(prop){
    86. // return elem.currentStyle(prop);
    87. // /*如果有属性,就返回属性值,与window.getComputedStyle(elem,null)[prop]
    88. // 的结果一样,因为不同的浏览器对方法的支持程度不同*/
    89. // }
    90. // else{
    91. // return elem.currentStyle;
    92. // //返回所有
    93. // }
    94. // }
    95. // }
    96. //像top、left是左上角的距离
    97. //查找元素对应的style的值
    98. function getStyles(elem, prop) {
    99. if (window.getComputedStyle) {
    100. if (prop) {
    101. if (prop === "left" || prop === "top") {
    102. return parseInt(window.getComputedStyle(elem, null)[prop]);
    103. }
    104. return window.getComputedStyle(elem, null)[prop];
    105. } else {
    106. return window.getComputedStyle(elem, null);
    107. }
    108. } else {
    109. if (prop) {
    110. if (prop === "left" || prop === "top") {
    111. return parseInt(elem.currentStyle[prop]);
    112. }
    113. return elem.currentStyle[prop];
    114. } else {
    115. return elem.currentStyle;
    116. }
    117. }
    118. }
    119. //元素,事件类型,触发的方法
    120. function addEvent(el, type, fn) {
    121. // console.log(el);
    122. if (el.addEventListener) {
    123. //方法存在
    124. el.addEventListener(type, fn, false);
    125. } else if (el.attachEvent) {
    126. el.attachEvent("on" + type, function () {
    127. fn.call(el); //将this指向改为调用的本身
    128. });
    129. } else {
    130. el["on" + type] = fn; //相当于el.on,例子el.onclick=func
    131. }
    132. }
    133. //移除事件
    134. function removeEvent(elem, type, fn) {
    135. if (elem.addEventListener) {
    136. elem.removeEventListener(type, fn, false);
    137. } else if (elem.attachEvent) {
    138. elem.detachEvent("on" + type, fn);
    139. } else {
    140. elem["on" + type] = null;
    141. }
    142. }
    143. //阻止冒泡与捕获
    144. function cancelBubble(e) {
    145. var e = e || window.event; //因为ie8 e里面拿不到事件,事件在window.event里面
    146. if (e.stopPropagation) {
    147. e.stopPropagation();
    148. } else {
    149. e.cancelBubble = true;
    150. }
    151. }
    152. //阻止默认函数行为
    153. function preventDefaultEvent(e) {
    154. var e = e || window.event;
    155. if (e.preventDefault) {
    156. e.preventDefault();
    157. } else {
    158. e.returnValue = false;
    159. }
    160. }
    161. //整个页面,算上滚动条的获取鼠标方位
    162. function pagePos(e) {
    163. var sLeft = getScrollOffset().left,
    164. sTop = getScrollOffset().top,
    165. cLeft = document.documentElement.clientLeft || 0,
    166. cTop = document.documentElement.clientTop || 0;
    167. return {
    168. X: e.clientX + sLeft - cLeft,
    169. Y: e.clientY + sTop - cTop,
    170. };
    171. }
    172. //拖拽 封装好 以后直接调用就行了
    173. function elemDrag(elem) {
    174. var x, y;
    175. addEvent(elem, "mousedown", function (e) {
    176. // console.log('1');
    177. var e = e || window.event;
    178. // console.log(elem);
    179. x = pagePos(e).X - getStyles(elem, "left");
    180. y = pagePos(e).Y - getStyles(elem, "top");
    181. addEvent(document, "mousemove", mouseMove);
    182. addEvent(document, "mouseup", mouseUp);
    183. cancelBubble(e); //保险起见 把阻止事件放进去
    184. preventDefaultEvent(e);
    185. });
    186. function mouseMove(e) {
    187. // console.log(elem);
    188. var e = e || window.event;
    189. elem.style.top = pagePos(e).Y - y + "px";
    190. elem.style.left = pagePos(e).X - x + "px";
    191. }
    192. function mouseUp(e) {
    193. var e = e || window.event;
    194. removeEvent(document, "mousemove", mouseMove);
    195. removeEvent(document, "mouseup", mouseUp);
    196. }
    197. }
    198. //发现子元素,兼容性写法
    199. function elemChildren(node){
    200. var temp = {
    201. 'length': 0,
    202. 'push': Array.prototype.push,
    203. 'splice': Array.prototype.splice
    204. },
    205. len = node.childNodes.length;
    206. for(var i = 0;i<len;i++){
    207. var childItem = node.childNodes[i];//得到所有节点
    208. if(childItem.nodeType === 1){//等于1是元素节点,而不是注释、文档节点
    209. temp[temp['length']] = childItem;
    210. temp['length']++;
    211. // temp.push(childItem); push方法
    212. }
    213. }
    214. return temp;
    215. }