Greasy Fork 还支持 简体中文。

js-domExtend

轻量级原生js增强插件,将部分原生dom对象方法模仿jQuery进行二次封装,便于使用

目前為 2022-04-27 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/444044/1044522/js-domExtend.js

  1. // ==UserScript==
  2. // @name js-domExtend
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.2
  5. // @description 轻量级原生js增强插件,将部分原生dom对象方法模仿jQuery进行二次封装,便于使用
  6. // @author tutu辣么可爱
  7. // @dayr 2022.4.27 GMT+0800 (中国标准时间)
  8. // @license MIT License
  9. // ==/UserScript==
  10.  
  11. /*
  12. *function $ele(dom, dom2)
  13. *parameter0 dom:需要创建的dom对象的html字符串或者选择器字符串
  14. *parameter1 dom2:选择器模式时生效,选择器的父节点,默认值document
  15. *return:dom对象或nodeList对象
  16. *note:本质是对createElement、querySelectorAll的二次封装,使用体验类似jQuery的$()方法
  17. *
  18. *function $eleFn(dom, dom2)
  19. *parameter0 dom:选择器字符串
  20. *parameter1 dom2:选择器的父节点,默认值document
  21. *return:一组方法
  22. *note:选择dom对象并执行一些特殊方法。具体用法见$eleFn.listen和$eleFn.ready部分
  23. *
  24. *function $eleFn.listen(callback, interval)
  25. *parameter0 callback:对dom对象监控时,循环执行的回调方法
  26. *parameter1 interval:dom对象的监控时间间隔,默认值500
  27. *return:定时器ID
  28. *note:本质是调用setInterval不断执行$ele方法检测dom对象是否存在
  29. *
  30. *function $eleFn.ready(callback, interval)
  31. *parameter0 callback:dom对象检测到存在时的回调方法
  32. *parameter1 timeout:dom对象存在性检测的超时时长
  33. *return:定时器ID
  34. *note:本质是调用$eleFn.listen检测对象是否存在,setTimeout控制超时时长
  35. *
  36. *function DOM.attr(key, val)
  37. *parameter0 key:dom对象属性名
  38. *parameter1 val:dom对象属性值
  39. *return:对应属性名的值或者原dom对象本身
  40. *note:没有val则返回对应属性名的值;有val则进行属性设置,返回dom对象本身,支持nodeList对象。本质是对getAttribute、setAttribute、removeAttribute的二次封装,使用体验类似jQuery的$.attr方法
  41. *
  42. *function DOM.css(key, val)
  43. *parameter0 key:dom对象css样式属性名
  44. *parameter1 val:dom对象css样式属性值
  45. *return:对应属性名的值或者原dom对象本身
  46. *note:没有val则返回对应属性名的值;有val则进行属性设置,返回dom对象本身,支持nodeList对象。本质是对getComputedStyle、DOM.style.setProperty的二次封装,使用体验类似jQuery的$.css方法
  47. *
  48. *function DOM.hide()
  49. *return:原dom对象本身
  50. *note:调用DOM.css隐藏dom对象,支持nodeList对象。本质是将dom对象样式display设置为none,使用体验类似jQuery的$.hide方法
  51. *
  52. *function DOM.show()
  53. *return:原dom对象本身
  54. *note:调用DOM.css显示dom对象,支持nodeList对象。本质是将dom对象样式display还原为原属性值,使用体验类似jQuery的$.show方法
  55. *
  56. *function DOM.insert(dom, position, reNew)
  57. *parameter0 dom:选择器字符串、dom对象、nodeList对象或多个dom对象组成的Array数组
  58. *parameter1 position:插入位置,默认值end
  59. *parameter2 reNew:返回值类型。布尔型可选参数,默认值false。true表示返回插入的dom对象、nodeList对象或dom对象构成的Array数组; false表示返回原dom对象本身
  60. *return:原dom对象本身、插入的新dom对象、新nodeList对象或新dom对象构成的Array数组
  61. *note:position为start时,插入到父节点(原dom对象)开头;position为end时,插入到父节点(原dom对象)结尾;position为before时,插入到dom节点(原dom对象)前面;position为after时,插入到dom节点(原dom对象)后面。本质是对insertBefore、append的二次封装
  62. *
  63. *function DOM.replace(dom)
  64. *parameter dom:选择器字符串、dom对象或多个dom对象组成的Array数组
  65. *return:新dom对象
  66. *note:本质是调用DOM.insert后将原dom节点remove
  67. *
  68. */
  69. function $ele(dom, dom2 = document) {
  70. switch (dom.slice(0, 1)) {
  71. case "<":
  72. dom2 = document.createElement("div");
  73. dom2.innerHTML = dom;
  74. dom2 = dom2.childNodes;
  75. break;
  76. default:
  77. dom2 = dom2.querySelectorAll(dom);
  78. break;
  79. }
  80. return dom2.length > 1 ? dom2 : dom2[0]
  81. }
  82. function $eleFn(dom, dom2 = document) {
  83. return {
  84. data: [dom, dom2],
  85. listen: function(callback, interval = 500) {
  86. var that = this;
  87. return setInterval(() => {
  88. if ($ele(that.data[0], that.data[1])) {
  89. callback();
  90. }
  91. }, interval)
  92. },
  93. ready: function(callback, timeout = 3000) {
  94. var timer = this.listen(() => {
  95. clearInterval(timer);
  96. callback();
  97. })
  98. setTimeout(() => {
  99. clearInterval(timer);
  100. }, timeout)
  101. return timer
  102. }
  103. }
  104. }
  105.  
  106. HTMLElement.prototype.attr = function(key, val) {
  107. if (typeof key === "string") {
  108. if (/string|boolean/.test(typeof val)) {
  109. if (!val && val !== false) {
  110. this.removeAttribute(key);
  111. } else {
  112. this.setAttribute(key, val);
  113. }
  114. return this;
  115. } else {
  116. return this.getAttribute(key);
  117. }
  118. }
  119. }
  120. HTMLElement.prototype.css = function(key, val) {
  121. if (typeof key === "string") {
  122. if (/string|boolean/.test(typeof val)) {
  123. this.style.setProperty(key, val);
  124. } else if (!val) {
  125. return getComputedStyle(this)[key];
  126. }
  127. } else {
  128. for (let i in key) {
  129. this.style.setProperty(i, key[i]);
  130. }
  131. }
  132. if (this.style === "") {
  133. this.attr("style", "")
  134. }
  135. return this;
  136. }
  137. HTMLElement.prototype.hide = function() {
  138. this.setAttribute("display_backup", this.css("display"));
  139. this.css("display", "none")
  140. return this;
  141. }
  142. HTMLElement.prototype.show = function() {
  143. var backup = this.attr("display_backup") ? this.attr("display_backup") : "";
  144. this.css("display", backup !== "none" ? backup : "");
  145. return this;
  146. }
  147. HTMLElement.prototype.insert = function(dom, position = "end",reNew=false) {
  148. dom = typeof dom === "string" ? $ele(dom) : dom;
  149. dom = (Array.isArray(dom)||dom instanceof NodeList) ? dom : [dom];
  150. switch (position) {
  151. case "start":
  152. Array.from(dom).reverse().forEach((e, i) => {
  153. this.insertBefore(e, this.firstChild);
  154. })
  155. break;
  156. case "end":
  157. dom.forEach((e, i) => {
  158. this.append(e);
  159. })
  160. break;
  161. case "before":
  162. Array.from(dom).reverse().forEach((e, i) => {
  163. this.parentElement.insertBefore(e, this);
  164. })
  165. break;
  166. case "after":
  167. if (this.parentElement.lastChild === this) {
  168. dom.forEach((e, i) => {
  169. this.append(e);
  170. })
  171. } else {
  172. let next = this.nextSilbing;
  173. Array.from(dom).reverse().forEach((e, i) => {
  174. this.parentElement.insertBefore(e, next);
  175. })
  176. }
  177. break;
  178. }
  179. if(reNew){
  180. return dom.length>1?dom:dom[0]
  181. }else{
  182. return this
  183. }
  184. }
  185. HTMLElement.prototype.replace = function(dom) {
  186. dom = this.insert(dom, "before",true);
  187. this.remove();
  188. return dom;
  189. }
  190. NodeList.prototype.attr = function(key,val){
  191. this.forEach((e, i) => {
  192. e.attr(key, val)
  193. })
  194. }
  195. NodeList.prototype.css = function(key,val){
  196. this.forEach((e, i) => {
  197. e.css(key, val)
  198. })
  199. }
  200. NodeList.prototype.hide = function() {
  201. this.forEach((e, i) => {
  202. e.hide();
  203. })
  204. }
  205. NodeList.prototype.show = function() {
  206. this.forEach((e, i) => {
  207. e.show();
  208. })
  209. }