for DOM

github: https://github.com/laixiangran/commonJS/blob/master/src/forDOM.js

代码

  1. /**
  2. * Created by laixiangran on 2016/1/24
  3. * homepage:http://www.cnblogs.com/laixiangran/
  4. * for DOM
  5. */
  6. (function(undefined) {
  7. var com = window.COM = window.COM || {};
  8. com.$D = {
  9. // 根据id查找
  10. byId: function(id, context) {
  11. var ctx = context || document;
  12. return ctx.getElementById(id);
  13. },
  14. // 根据类名查找
  15. byClassName: function(className, context) {
  16. var ctx = context || document;
  17. return ctx.getElementsByClassName(className);
  18. },
  19. // 根据标签名查找
  20. byTagName: function(tagName, context) {
  21. var ctx = context || document;
  22. return ctx.getElementsByTagName(tagName);
  23. },
  24. // 在文档中添加样式
  25. addSheet: function() {
  26. var doc, cssCode;
  27. if (arguments.length == 1) {
  28. doc = document;
  29. cssCode = arguments[0];
  30. }else if (arguments.length == 2) {
  31. doc = arguments[0];
  32. cssCode = arguments[1];
  33. }else {
  34. alert("addSheet函数最多接受两个参数!");
  35. }
  36. var headElement = doc.getElementsByTagName("head")[0];
  37. var styleElements = headElement.getElementsByTagName("style");
  38. if(styleElements.length == 0){ // 如果不存在style元素则创建
  39. if (!+"\v1") { // ie
  40. doc.createStyleSheet();
  41. }else {
  42. var tempStyleElement = doc.createElement("style"); //w3c
  43. tempStyleElement.setAttribute("type", "text/css");
  44. headElement.appendChild(tempStyleElement);
  45. }
  46. }
  47. var styleElement = styleElements[0];
  48. var media = styleElement.getAttribute("media");
  49. if (media != null && !/screen/.test(media.toLowerCase())) {
  50. styleElement.setAttribute("media", "screen");
  51. }
  52. if (!+"\v1") { // ie
  53. styleElement.styleSheet.cssText += cssCode;
  54. }else if (/a/[-1] == "a") {
  55. styleElement.innerHTML += cssCode; // 火狐支持直接innerHTML添加样式表字串
  56. }else{
  57. styleElement.appendChild(doc.createTextNode(cssCode))
  58. }
  59. },
  60. /*
  61. * iframe高度自适应
  62. * @param id iframe的id
  63. * @param endTime 计算的时间
  64. * */
  65. adjustIframe: function(id, endTime) {
  66. var iframe = this.byId(id),
  67. time = 0,
  68. end = endTime || 30,
  69. intervalID;
  70. if (iframe) {
  71. function callback() {
  72. time = time + 1;
  73. if (time == end) {
  74. clearInterval(intervalID)
  75. }
  76. var idoc = iframe.contentWindow && iframe.contentWindow.document || iframe.contentDocument;
  77. var iheight = Math.max(idoc.body.scrollHeight, idoc.documentElement.scrollHeight);
  78. iframe.style.height = iheight + "px";
  79. }
  80. intervalID = setInterval(callback, 50)
  81. }
  82. },
  83. /*
  84. * 拖拽元素
  85. * @param elem 拖拽的元素
  86. * @param callback 拖拽结束之后的回调函数
  87. * */
  88. drag: function(elem, callback) {
  89. callback = callback || function() {};
  90. var $D = this;
  91. var params = {
  92. left: 0,
  93. top: 0,
  94. currentX: 0,
  95. currentY: 0,
  96. flag: false
  97. };
  98. if ($D.getStyle(elem, "left") !== "auto") {
  99. params.left = $D.getStyle(elem, "left");
  100. }
  101. if ($D.getStyle(elem, "top") !== "auto") {
  102. params.top = $D.getStyle(elem, "top");
  103. }
  104. elem.onmousedown = function(event) {
  105. params.flag = true;
  106. event = event || window.event;
  107. params.currentX = event.clientX;
  108. params.currentY = event.clientY;
  109. };
  110. document.onmousemove = function(event) {
  111. event = event || window.event;
  112. if (params.flag) {
  113. var nowX = event.clientX,
  114. nowY = event.clientY;
  115. var disX = nowX - params.currentX,
  116. disY = nowY - params.currentY;
  117. elem.style.left = parseInt(params.left) + disX + "px";
  118. elem.style.top = parseInt(params.top) + disY + "px";
  119. }
  120. };
  121. document.onmouseup = function() {
  122. params.flag = false;
  123. if ($D.getStyle(elem, "left") !== "auto") {
  124. params.left = $D.getStyle(elem, "left");
  125. }
  126. if ($D.getStyle(elem, "top") !== "auto") {
  127. params.top = $D.getStyle(elem, "top");
  128. }
  129. callback(elem);
  130. };
  131. },
  132. // 获取元素被窗口卷去的上部分高度
  133. getScrollTop: function(elem) {
  134. var doc = elem ? elem.ownerDocument : document;
  135. return doc.documentElement.scrollTop || doc.body.scrollTop;
  136. },
  137. // 获取元素被窗口卷去的左部分宽度
  138. getScrollLeft: function(elem) {
  139. var doc = elem ? elem.ownerDocument : document;
  140. return doc.documentElement.scrollLeft || doc.body.scrollLeft;
  141. },
  142. // 获取元素的左偏移量
  143. getElementLeft: function(elem) {
  144. var actualLeft = elem.offsetLeft;
  145. var current = elem.offsetParent;
  146. while (current !== null) {
  147. actualLeft += current.offsetLeft;
  148. current = current.offsetParent;
  149. }
  150. return actualLeft;
  151. },
  152. // 获取元素的上偏移量
  153. getElementTop: function(elem) {
  154. var actualTop = elem.offsetTop;
  155. var current = elem.offsetParent;
  156. while (current !== null) {
  157. actualTop += current. offsetTop;
  158. current = current.offsetParent;
  159. }
  160. return actualTop;
  161. },
  162. // 获取元素的范围(包括窗口不可见的部分)
  163. rect: function(elem) {
  164. var left = 0,
  165. top = 0,
  166. right = 0,
  167. bottom = 0;
  168. if (!elem.getBoundingClientRect) {
  169. left = this.getElementLeft(elem);
  170. top = this.getElementTop(elem);
  171. right = left + elem.offsetWidth;
  172. bottom = top + elem.offsetHeight;
  173. } else {
  174. var rect = elem.getBoundingClientRect();
  175. left = right = this.getScrollLeft(elem);
  176. top = bottom = this.getScrollTop(elem);
  177. left += rect.left;
  178. right += rect.right;
  179. top += rect.top;
  180. bottom += rect.bottom;
  181. }
  182. return {
  183. "left": left,
  184. "top": top,
  185. "right": right,
  186. "bottom": bottom
  187. };
  188. },
  189. // 获取元素在窗口可见的范围
  190. clientRect: function(elem) {
  191. var rect = this.rect(elem),
  192. sLeft = this.getScrollLeft(elem),
  193. sTop = this.getScrollTop(elem);
  194. rect.left -= sLeft;
  195. rect.right -= sLeft;
  196. rect.top -= sTop;
  197. rect.bottom -= sTop;
  198. return rect;
  199. },
  200. // 获取浏览器视口大小
  201. getViewport: function() {
  202. if (document.compatMode == "BackCompat") { // 判断是否运行在混杂模式
  203. return {
  204. "width": document.body.clientWidth,
  205. "height": document.body.clientHeight
  206. };
  207. } else {
  208. return {
  209. "width": document.documentElement.clientWidth,
  210. "height": document.documentElement.clientHeight
  211. };
  212. }
  213. },
  214. /*
  215. * 元素是否包含某元素
  216. * @parma elemA 包含元素
  217. * @param elemB 被包含元素
  218. * */
  219. contains: function(elemA, elemB) {
  220. if (typeof elemA.contains == "function" && (!COM.$B.engine.webkit || COM.$B.engine.webkit >= 522)) {
  221. return elemA.contains(elemB);
  222. } else if (typeof elemA.compareDocumentPosition == "function") {
  223. return !!(elemA.compareDocumentPosition(elemB) & 16);
  224. } else {
  225. var node = elemB.parentNode;
  226. do {
  227. if (node === elemA) {
  228. return true;
  229. } else {
  230. node = node.parentNode;
  231. }
  232. } while (node !== null);
  233. return false;
  234. }
  235. },
  236. // 获取所有css属性
  237. curStyle: function(elem) {
  238. if (document.defaultView && typeof document.defaultView.getComputedStyle == "function") {
  239. return document.defaultView.getComputedStyle(elem, null);
  240. } else {
  241. return elem.currentStyle;
  242. }
  243. },
  244. /*
  245. * 获取元素指定的css属性的值
  246. * @param elem 当前元素
  247. * @parma name css属性名
  248. * */
  249. getStyle: function(elem, name) {
  250. var style = null;
  251. if (document.defaultView && typeof document.defaultView.getComputedStyle == "function") {
  252. style = document.defaultView.getComputedStyle(elem, null);
  253. return name in style ? style[name] : style.getPropertyValue(name);
  254. } else {
  255. var curStyle = elem.currentStyle;
  256. style = elem.style;
  257. if (name == "opacity") {
  258. if (/alpha\(opacity=(.*)\)/i.test(curStyle.filter)) {
  259. var opacity = parseFloat(RegExp.$1);
  260. return opacity ? opacity / 100 : 0;
  261. }
  262. return 1;
  263. }
  264. if (name == "float") {
  265. name = "styleFloat";
  266. }
  267. var ret = curStyle[name] || curStyle[com.$S.camelize(name)];
  268. // 单位转换
  269. if (!/^-?\d+(?:px)?$/i.test(ret) && /^\-?\d/.test(ret)) {
  270. var left = style.left,
  271. rtStyle = elem.runtimeStyle,
  272. rsLeft = rtStyle.left;
  273. rtStyle.left = curStyle.left;
  274. style.left = ret || 0;
  275. ret = style.pixelLeft + "px";
  276. style.left = left;
  277. rtStyle.left = rsLeft;
  278. }
  279. return ret;
  280. }
  281. },
  282. /*
  283. * 设置元素指定的css属性的值
  284. * @param elem 当前元素
  285. * @parma style css属性名
  286. * @param value css属性的指
  287. * */
  288. setStyle: function(elems, style, value) {
  289. if (!elems.length) {
  290. elems = [elems];
  291. }
  292. if (typeof style == "string") {
  293. var s = style;
  294. style = {};
  295. style[s] = value;
  296. }
  297. com.$A.forEach(elems, function(elem) {
  298. for (var name in style) {
  299. if (style.hasOwnProperty(name)) {
  300. var value = style[name];
  301. if (name == "opacity" && com.$B.browser.ie) {
  302. elem.style.filter = (elem.currentStyle && elem.currentStyle.filter || "").replace( /alpha\([^)]*\)/, "" ) + " alpha(opacity=" + (value * 100 | 0) + ")";
  303. } else if (name == "float") {
  304. elem.style[com.$B.browser.ie ? "styleFloat" : "cssFloat" ] = value;
  305. } else {
  306. elem.style[com.$S.camelize(name)] = value;
  307. }
  308. }
  309. }
  310. });
  311. },
  312. // 获取元素大小
  313. getSize: function(elem) {
  314. var width = elem.offsetWidth,
  315. height = elem.offsetHeight;
  316. if (!width && !height) {
  317. var repair = this.contains(document.body, elem),
  318. parent;
  319. if (!repair) { // 元素不在body上
  320. parent = elem.parentNode;
  321. document.body.insertBefore(elem, document.body.childNodes[0]);
  322. }
  323. var style = elem.style,
  324. cssShow = {
  325. position: "absolute",
  326. visibility: "hidden",
  327. display: "block",
  328. left: "-9999px",
  329. top: "-9999px"
  330. },
  331. cssBack = {
  332. position: style.position,
  333. visibility: style.visibility,
  334. display: style.display,
  335. left: style.left,
  336. top: style.top
  337. };
  338. this.setStyle(elem, cssShow);
  339. width = elem.offsetWidth;
  340. height = elem.offsetHeight;
  341. this.setStyle(elem, cssBack);
  342. if (!repair) {
  343. parent ? parent.appendChild(elem) : document.body.removeChild(elem);
  344. }
  345. }
  346. return {
  347. "width": width,
  348. "height": height
  349. };
  350. }
  351. };
  352. }());

参考

http://www.cnblogs.com/cloudgamer/

commonJS — DOM操作(for DOM)的更多相关文章

  1. vue怎么不通过dom操作获取dom节点

    今天写一个公众号的项目,写了一个vue的搜索组件,点击搜索框时,背景出现一个遮罩,代码结构如下: template:`<div class="searchBar-div"&g ...

  2. 为什么DOM操作很慢

    转自:http://kb.cnblogs.com/page/534571/ 一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来 ...

  3. DOM操作--表格点击行变色

    点击表格行变色,这种网页效果应该还是比较常见的.大家应该看见了,我这里的效果是用DOM操作实现的,那么很多人会问什么是DOM操作,贴出代码之前我就和大家解释一下什么是DOM操作: DOM是Docume ...

  4. jQuery2.x源码解析(DOM操作篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) jQuery这个类库最为核心重要的功能就是DOM ...

  5. jQuery(3)——DOM操作

    ---恢复内容开始---   jQuery中的DOM操作 [DOM操作分类] DOM操作分为DOM Core(核心).HTML-DOM和CSS-DOM三个方面. DOM Core:任何一种支持DOM的 ...

  6. 第三章(jQuery中的DOM操作)

    3.1 DOM 操作分类 ①DOM Core 包括(getElementById() , getElementsByTagName() , getAttribute() , setAttribute( ...

  7. 为什么说DOM操作很慢

    转自http://www.cnblogs.com/yuzhongwusan/articles/5275933.html   一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大 ...

  8. JavaScript的BOM、DOM操作、节点以及表格(二)

    BOM操作 一.什么是BOM BOM(Browser Object Model)即浏览器对象模型.     BOM提供了独立于内容 而与浏览器窗口进行交互的对象:     BOM由一系列相关的对象构成 ...

  9. 事件冒泡及事件委托的理解(JQuery Dom操作)

    jQuery事件冒泡: click mouseenter 等事件没有绑定 也会触发,只是触发后没有任何结果 子元素触发事件后,会把触发事件传递给父元素,那么父元素也会被触发. 不管有没有绑定事件,都会 ...

  10. BOM与DOM之DOM操作

    目录 一:DOM操作 1.DOM介绍 2.DOM标准规定HTML文档中的每个成分都是一个节点(node): 3.DOM操作需要用关键字 二:查找标签 1.id查找 类查找 标签查找(直接查找) 2.i ...

随机推荐

  1. Winform容器标签 打印标签 对话框控件

    一.容器标签 布局: Anchor:锁定位置,指定与窗口容器的边缘位置,会随着窗口大小的改变而改变: Dock:填充窗口的位置.一般与容器标签同时使用. 1.Panel:对控件进行分组.可以独立布局, ...

  2. IOSView翻转扭矩位移

    CoreGraphics.h CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);[xxx setTransform: ...

  3. mvc api

    ===============================首页===================================================== 扫码 快递公司接口uri: ...

  4. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  5. QT笔记之实现阴影窗口

    方法一: 代码实现 在窗口构造函数中加入:setAttribute(Qt::WA_TranslucentBackground),保证不被绘制上的部分透明 重写void paintEvent(QPain ...

  6. Python3基础 双星号 求一个数的几次幂

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  7. TCP连接的状态详解以及故障排查

    我们通过了解 TCP各个状态 ,可以排除和定位网络或系统故障时大有帮助. 一.TCP状态 LISTENING :侦听来自远方的TCP端口的连接请求 . 首先服务端需要打开一个 socket 进行监听, ...

  8. .Net验证码实现基础--Draw

    命名空间 using System.Draw; using System.Draw.Drawing2D; 在form等控件的 事件中 添加 paint事件 ///////画各种形状(空心)////// ...

  9. [SAP ABAP开发技术总结]ALV

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. Entity Framework 学习初级篇--EntityClient(转)

    摘自:http://www.cnblogs.com/xray2005/archive/2009/05/13/1456374.html System.Data.EntityClient 命名空间是 实体 ...