JQuery DOM

Optimize JQuery experience of insert DOM.

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/422934/1431188/JQuery%20DOM.js

  1. // ==UserScript==
  2. // @name JQuery DOM
  3. // @namespace https://gf.qytechs.cn/
  4. // @version 1.1.16
  5. // @description Optimize JQuery experience of insert DOM.
  6. // @author JMRY
  7. // @include *://*
  8. // @grant none
  9. // ==/UserScript==
  10. if(typeof jQuery===`function`){
  11. jQuery.getDOMString=function(dom_tag,dom_attr,dom_html){
  12. /*
  13. dom_tag:string
  14. HTML tags, like div, input, p, button, and so on.
  15. dom_attr:object
  16. HTML attributes, struct:
  17. {
  18. id:`id`,
  19. class:`class1 class2` OR [`class1`,`class2`],
  20. style:`border:none;` OR {border:`none`},
  21. Extend attributes:
  22. bind:{
  23. click:function,
  24. },
  25. }
  26. dom_attr:string
  27. HTML inner text
  28. dom_html:string
  29. HTML inner text
  30. */
  31. //属性黑名单指的是在遍历属性时直接忽略的key。
  32. //如果需要处理这些key但不要插入html中,则应使用allow_insert_attr,将它置为false即可。
  33. let attr_blacklist=[
  34. `bind`,`children`,
  35. ]
  36. if(dom_tag==undefined){ //html标记为空时,直接返回空值
  37. return ``;
  38. }else if(dom_tag!=undefined && dom_attr==undefined && dom_html==undefined){ //html标记不为空、属性和内容为空时,直接返回字符串
  39. return dom_tag;
  40. }else if(dom_tag!=undefined && dom_attr!=undefined && dom_html==undefined){
  41. dom_html=``;
  42. }
  43. let dom_attr_string=[];
  44. //dom_attr is string, it will be the inner html, without attributes.
  45. if(typeof dom_attr==`string`){
  46. dom_html=dom_attr;
  47. }else if(typeof dom_attr==`object`){
  48. let allow_insert_attr;
  49. for(let key in dom_attr){
  50. allow_insert_attr=true;
  51. let cur_dom_attr=dom_attr[key];
  52. // if(key!=`bind`){
  53. // if(jQuery.inArray(key,attr_blacklist)<0){
  54. if(!attr_blacklist.includes(key)){
  55. //HTML属性的特殊处理
  56. switch(key){
  57. //Class数组化处理
  58. case `class`:
  59. if(typeof cur_dom_attr==`object` && cur_dom_attr.length){
  60. cur_dom_attr=cur_dom_attr.join(` `).trim();
  61. }else if(typeof cur_dom_attr==`object` && cur_dom_attr.length==undefined){
  62. let classList=[];
  63. for(let key in cur_dom_attr){
  64. if(cur_dom_attr[key]==true){
  65. classList.push(key);
  66. }
  67. }
  68. cur_dom_attr=classList.join(` `).trim();
  69. }
  70. break;
  71. //Style对象化处理(交给getDOMObject,因此将allow_insert_attr置为false,以跳过插入属性)
  72. case `style`:
  73. if(typeof cur_dom_attr==`object`){
  74. allow_insert_attr=false;
  75. }
  76. break;
  77. //Html属性转为text。此属性会覆盖dom_html参数,因此不可混用
  78. case `html`:
  79. dom_html=cur_dom_attr;
  80. allow_insert_attr=false;
  81. break;
  82. //tbody属性处理
  83. case `tbody`: case `tr`: case `td`:
  84. allow_insert_attr=false;
  85. break;
  86. }
  87. //cur_dom_attr为undefined、null时,不插入此属性
  88. if(cur_dom_attr!=undefined && cur_dom_attr!=null && allow_insert_attr){
  89. dom_attr_string.push(`${key.replace(/([A-Z])/g,"-$1").toLowerCase()}="${cur_dom_attr}"`);
  90. }
  91. }
  92. }
  93. }
  94. if(dom_tag==`html`){
  95. return `${dom_html}`;
  96. }
  97. return `<${dom_tag} ${dom_attr_string.join(` `)}>${dom_html}</${dom_tag}>`;
  98. }
  99.  
  100. jQuery.getDOMObject=function(dom_tag,dom_attr,dom_html, attach_type){
  101. //dom_tag为对象时,和普通情况一样
  102. if(typeof dom_tag==`object` && dom_tag.length==undefined){
  103. let dom_attr_fix_blacklist=[
  104. `tag`,`attachType`,
  105. ]
  106. let dom_attr_fix_replace=new Map([
  107. [`tagName`,`tag`],[`tag_name`,`tagName`],
  108. [`attrName`,`attr`],[`attr_name`,`attrName`],
  109. ]);
  110. let dom_attr_fix={};
  111. if(dom_tag.attr==undefined){
  112. for(let key in dom_tag){
  113. if(!dom_attr_fix_blacklist.includes(key)){
  114. let key_fix=key;
  115. if(dom_attr_fix_replace.get(key)){
  116. key_fix=dom_attr_fix_replace.get(key_fix);
  117. }
  118. dom_attr_fix[key_fix]=dom_tag[key];
  119. }
  120. }
  121. }
  122. dom_attr=dom_tag.attr || dom_attr_fix;
  123. dom_html=dom_tag.html;
  124. attach_type=dom_tag.attachType || attach_type;
  125. dom_tag=dom_tag.tag;
  126. }
  127.  
  128. try{
  129. let domObject=jQuery(jQuery.getDOMString(dom_tag, dom_attr, dom_html));
  130. if(typeof dom_attr==`object`){
  131. //DOM样式
  132. try{
  133. /*
  134. CSS Struct:
  135. style:{
  136. width:`255px`,
  137. height:`255px`,
  138. }
  139. */
  140. if(typeof dom_attr.style==`object`){
  141. domObject.css(dom_attr.style);
  142. }
  143. }catch(e){
  144. console.error(e);
  145. }
  146.  
  147. //DOM事件绑定
  148. try{
  149. /*
  150. Bind Struct:
  151. bind:{
  152. click:function,
  153. }
  154. Another Struct:
  155. bind:{
  156. click:{
  157. data:{},
  158. function:function,
  159. }
  160. }
  161. */
  162. if(typeof dom_attr.bind==`object`){
  163. for(let key in dom_attr.bind){
  164. let curBind=dom_attr.bind[key];
  165. domObject.unbind(key);
  166. if(typeof curBind==`function`){
  167. domObject.bind(key, curBind);
  168. }else if(typeof curBind==`object`){
  169. curBind={
  170. ...{
  171. data:{},
  172. function(){},
  173. },
  174. ...curBind,
  175. }
  176. domObject.bind(key, curBind.data, curBind.function);
  177. }
  178. }
  179. }
  180. }catch(e){
  181. console.error(e);
  182. }
  183.  
  184. //DOM子项
  185. try{
  186. if(typeof dom_attr.children==`object`){
  187. let default_children={
  188. tag:undefined,attr:undefined,html:undefined,attachType:`append`
  189. };
  190.  
  191. if(dom_attr.children.length==undefined){
  192. /*仅一个子项时,可以直接使用Object
  193. {
  194. tag:`html`,attr:{id:`id`},html:`Test`,attachType:`append`
  195. }
  196. */
  197. let children={
  198. // ...default_children,
  199. ...JSON.parse(JSON.stringify(default_children)),
  200. ...dom_attr.children,
  201. }
  202. // domObject.attachDOM(children.tag,children.attr,children.html,children.attachType);
  203. domObject.append(jQuery.getDOMObject(children));
  204. }else{
  205. /*多个子项时,采用数组形式
  206. [
  207. {
  208. tag:`html`,attr:{id:`id1`},html:`Test1`,attachType:`append`
  209. },
  210. {
  211. tag:`html`,attr:{id:`id2`},html:`Test2`,attachType:`append`
  212. },
  213. ]
  214. */
  215. for(let i=0; i<dom_attr.children.length; i++){
  216. let children={
  217. // ...default_children,
  218. ...JSON.parse(JSON.stringify(default_children)),
  219. ...dom_attr.children[i],
  220. }
  221. // domObject.attachDOM(children.tag,children.attr,children.html,children.attachType);
  222. domObject.append(jQuery.getDOMObject(children));
  223. }
  224. }
  225. }
  226. }catch(e){
  227. console.error(e);
  228. }
  229.  
  230. //TBODY表格
  231. try{
  232. if(typeof dom_attr.tbody==`object` || typeof dom_attr.tr==`object`){
  233. let default_tr={
  234. tag:`tr`,attr:undefined,html:undefined,children:[],attachType:`append`
  235. };
  236. let default_td={
  237. tag:`td`,attr:undefined,html:undefined,children:[],attachType:`append`
  238. }
  239. let trDomObject;
  240. let trList=dom_attr.tbody || dom_attr.tr;
  241. for(let i=0; i<trList.length; i++){
  242. let curTr=trList[i];
  243. let tr={
  244. ...JSON.parse(JSON.stringify(default_tr)),
  245. ...curTr
  246. }
  247. // let trDomObject=domObject.attachDOM(tr.tag,tr.attr,tr.html,tr.attachType);
  248. trDomObject=jQuery.getDOMObject(tr);
  249. for(let j=0; j<curTr.td.length; j++){
  250. let curTd=curTr.td[j];
  251. if(typeof curTd==`string`){
  252. curTd={html:curTd};
  253. }
  254. let td={
  255. ...JSON.parse(JSON.stringify(default_td)),
  256. ...curTd,
  257. }
  258. // trDomObject.attachDOM(td.tag,td.attr,td.html,td.attachType);
  259. trDomObject.append(jQuery.getDOMObject(td));
  260. }
  261. domObject.append(trDomObject);
  262. }
  263. }
  264. }catch(e){
  265. console.error(e);
  266. }
  267. }
  268. return domObject;
  269. }catch(e){
  270. //对不规范写法的容错,如:只传dom_tag的情况下,直接返回字符串,而不是JQuery对象。
  271. return jQuery.getDOMString(dom_tag, dom_attr, dom_html);
  272. }
  273. }
  274.  
  275. jQuery.fn.attachDOM=function(dom_tag, dom_attr, dom_html, attach_type){
  276. //dom_tag为数组时,批量为母元素添加元素
  277. if(typeof dom_tag==`object` && dom_tag.length!=undefined){
  278. let default_children={
  279. tag:undefined,attr:undefined,html:undefined,attachType:`append`
  280. };
  281. if(attach_type==`prepend` || attach_type==`before`){
  282. //往插入时,将数组调转,以确保插入顺序和数组顺序一致
  283. dom_tag.reverse();
  284. }
  285. for(let cur of dom_tag){
  286. cur={
  287. ...JSON.parse(JSON.stringify(default_children)),
  288. ...cur,
  289. }
  290. this.attachDOM(cur,undefined,undefined,attach_type);
  291. }
  292. return;
  293. }
  294.  
  295. let domObject=jQuery.getDOMObject(dom_tag, dom_attr, dom_html);
  296.  
  297. switch(attach_type){
  298. case `append`:
  299. this.append(domObject);
  300. break;
  301. case `prepend`:
  302. this.prepend(domObject);
  303. break;
  304. case `after`:
  305. this.after(domObject);
  306. break;
  307. case `before`:
  308. this.before(domObject);
  309. break;
  310. case `html`:
  311. this.html(domObject);
  312. break;
  313. }
  314. return domObject;
  315. }
  316.  
  317. jQuery.fn.appendDOM=function(dom_tag,dom_attr,dom_html){
  318. return this.attachDOM(dom_tag,dom_attr,dom_html,`append`);
  319. }
  320. jQuery.fn.prependDOM=function(dom_tag,dom_attr,dom_html){
  321. return this.attachDOM(dom_tag,dom_attr,dom_html,`prepend`);
  322. }
  323. jQuery.fn.afterDOM=function(dom_tag,dom_attr,dom_html){
  324. return this.attachDOM(dom_tag,dom_attr,dom_html,`after`);
  325. }
  326. jQuery.fn.beforeDOM=function(dom_tag,dom_attr,dom_html){
  327. return this.attachDOM(dom_tag,dom_attr,dom_html,`before`);
  328. }
  329. jQuery.fn.htmlDOM=function(dom_tag,dom_attr,dom_html){
  330. return this.attachDOM(dom_tag,dom_attr,dom_html,`html`);
  331. }
  332. jQuery.fn.getHtml=function(dom_tag,dom_attr,dom_html){
  333. return this.attachDOM(dom_tag,dom_attr,dom_html,`html`)[0].outerHTML;
  334. }
  335. jQuery.getDOMHtml=function(dom_tag,dom_attr,dom_html){
  336. return jQuery.fn.getHtml(dom_tag,dom_attr,dom_html);
  337. }
  338. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址