dom.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. * @author 明浩
  3. * @time 2020-8-14
  4. * @dec 操作DOM 常用方法
  5. */
  6. import { trigger } from "./index.js";
  7. export function $(expr, con) {
  8. return typeof expr === "string"
  9. ? (con || document).querySelector(expr)
  10. : expr || null;
  11. }
  12. $.createElement = (tag, attrs) => {
  13. const elem = document.createElement(tag);
  14. for (let attr in attrs) {
  15. if (attr === "appendTo") {
  16. const parent = attrs.appendTo;
  17. parent.appendChild(elem);
  18. } else if (attr === "innerHTML") {
  19. elem.innerHTML = attrs.innerHTML;
  20. } else if (attr === "width" || attr === "height") {
  21. elem.style[attr] =
  22. String(attrs[attr]).indexOf("%") > -1
  23. ? attrs[attr]
  24. : attrs[attr] + "px";
  25. elem.setAttribute(attr, attrs[attr]);
  26. } else if (attr === "x") {
  27. elem.style.left = attrs[attr] + "px";
  28. elem.setAttribute(attr, attrs[attr]);
  29. } else if (attr === "y") {
  30. elem.style.top = attrs[attr] + "px";
  31. elem.setAttribute(attr, attrs[attr]);
  32. } else if (attr === "styles") {
  33. $.styles(elem, attrs[attr]);
  34. } else {
  35. elem.setAttribute(attr, attrs[attr]);
  36. }
  37. }
  38. return elem;
  39. };
  40. $.on = (element, event, selector, callback) => {
  41. if (!callback) {
  42. callback = selector;
  43. $.bind(element, event, callback);
  44. } else {
  45. $.delegate(element, event, selector, callback);
  46. }
  47. };
  48. $.off = (element, event, handler) => {
  49. element.removeEventListener(event, handler);
  50. };
  51. $.bind = (element, event, callback) => {
  52. event.split(/\s+/).forEach(function(event) {
  53. element.addEventListener(event, callback);
  54. });
  55. };
  56. $.delegate = (element, event, selector, callback) => {
  57. element.addEventListener(event, function(e) {
  58. const delegatedTarget = e.target.closest(selector);
  59. if (delegatedTarget) {
  60. e.delegatedTarget = delegatedTarget;
  61. callback.call(this, e, delegatedTarget);
  62. }
  63. });
  64. };
  65. $.closest = (selector, element) => {
  66. if (!element) return null;
  67. if (element.matches(selector)) {
  68. return element;
  69. }
  70. return $.closest(selector, element.parentNode);
  71. };
  72. if (!Element.prototype.matches) {
  73. Element.prototype.matches =
  74. Element.prototype.msMatchesSelector ||
  75. Element.prototype.webkitMatchesSelector;
  76. }
  77. if (!Element.prototype.closest) {
  78. Element.prototype.closest = function(s) {
  79. let el = this;
  80. if (!document.documentElement.contains(el)) return null;
  81. do {
  82. if (el.matches(s)) return el;
  83. el = el.parentElement || el.parentNode;
  84. } while (el !== null && el.nodeType === 1);
  85. return null;
  86. };
  87. }
  88. $.attr = (element, attr, value) => {
  89. if (!value && value !== 0 && typeof attr === "string") {
  90. return element.getAttribute(attr);
  91. }
  92. if (typeof attr === "object") {
  93. for (let key in attr) {
  94. $.attr(element, key, attr[key]);
  95. }
  96. return;
  97. }
  98. if (attr === "width" || attr === "height") {
  99. element.style[attr] =
  100. String(value).indexOf("%") > -1 ? value : value + "px";
  101. } else if (attr === "x") {
  102. element.style.left = value + "px";
  103. } else if (attr === "y") {
  104. element.style.top = value + "px";
  105. }
  106. element.setAttribute(attr, value);
  107. };
  108. $.styles = (element, css, value) => {
  109. if (!value && value !== 0 && typeof style === "string") {
  110. return element.style[css];
  111. }
  112. if (typeof css === "object") {
  113. for (let key in css) {
  114. $.styles(element, key, css[key]);
  115. }
  116. return;
  117. }
  118. if (typeof value === "number") {
  119. value += "px";
  120. }
  121. element.style[css] = value;
  122. };
  123. $.loadJs = (url, callback) => {
  124. var script = document.createElement("script");
  125. script.type = "text/javascript";
  126. if (typeof callback !== "undefined") {
  127. if (script.readyState) {
  128. script.onreadystatechange = function() {
  129. if (script.readyState == "loaded" || script.readyState == "complete") {
  130. script.onreadystatechange = null;
  131. callback();
  132. }
  133. };
  134. } else {
  135. script.onload = function() {
  136. callback();
  137. };
  138. }
  139. }
  140. script.src = url;
  141. document.body.appendChild(script);
  142. };
  143. $.trigger = (element, event) => {
  144. trigger(element, event);
  145. };