JQuery DOM

Optimize JQuery experience of insert DOM.

目前为 2024-01-22 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/422934/1315442/JQuery%20DOM.js

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