mylib

我的工具

目前為 2024-06-26 提交的版本,檢視 最新版本

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

  1. // ==UserScript==
  2. // @name mylib
  3. // @description 我的工具
  4. // @dependency unsafeWindow GM_setValue GM_getValue
  5. // ==/UserScript==
  6. (function(win){
  7. const e=document.documentElement.firstElementChild,sv=GM_setValue,gv=GM_getValue;
  8. let z,myBtns;
  9. // win.gv=gv;win.sv=sv
  10. win.my=new class {
  11. constructor(){
  12. if(e.tagName==='Z') z=this.zone=e;
  13. else {
  14. z=this.zone=this.before('z',e,'',`class`,'rwf');
  15. win.cl=win.console.log;win.al=win.alert;
  16. }
  17. if(z.querySelector('my-btns')) myBtns=z.querySelector('my-btns');
  18. else{
  19. this.addStyle(`my-btns{display:block;z-index:9195129;position:fixed;height: min-content;}.my-btn{user-select: none;font-size: initial !important;}`,'my-btns');
  20. myBtns=this.append('my-btns',z,'',`class`,'rwf');
  21. myBtns.style.left=gv('left',0);
  22. myBtns.style.top=gv('top',0);
  23. // myBtns.style.display='flex';
  24. if(!gv('isFixed',0) || top!==self) this.bindDrag(myBtns);
  25. myBtns.onmouseup=e=>{
  26. sv('left',myBtns.style.left);
  27. sv('top',myBtns.style.top);
  28. }
  29. }
  30. }
  31. addStyle(css,className='rwf'){//depend:after,zone
  32. return this.append('style',z,css,`class`,className);
  33. }
  34. append(tag,dom,content){
  35. if(!tag) return;
  36. const son=typeof tag==='string'?document.createElement(tag):tag instanceof EventTarget?tag:0;
  37. let len=arguments.length;
  38. if(dom instanceof EventTarget)dom.append(son);
  39. if(content)son.append(content);
  40. while(len>3){
  41. son.setAttribute([arguments[len-2]],arguments[len-1]);len-=2;
  42. }return son;
  43. }//my.append('tag',document.body,'content','idk','true','data-s')
  44. after(tag,dom,content){
  45. if(!tag) return;
  46. const bro=typeof tag==='string'?document.createElement(tag):tag instanceof EventTarget?tag:0;
  47. let len=arguments.length;
  48. if(dom instanceof EventTarget)dom.after(bro);
  49. if(content)bro.append(content);
  50. while(len>3){
  51. bro.setAttribute([arguments[len-2]],arguments[len-1]);len-=2;
  52. }return bro;
  53. }//my.after('div',document.body,'','suck','1','dick',000)
  54. before(tag,dom,content){
  55. if(!tag) return;
  56. const bro=typeof tag==='string'?
  57. document.createElement(tag):tag instanceof EventTarget?
  58. tag:0;
  59. let len=arguments.length;
  60. if(dom instanceof EventTarget)dom.before(bro);
  61. if(content)bro.append(content);
  62. while(len>3){
  63. bro.setAttribute([arguments[len-2]],arguments[len-1]);len-=2;
  64. }return bro;
  65. }// my.before('div',document.head,'','suck','1','dick')
  66.  
  67. eods(){//enable or disable style in my.zone
  68. z.querySelectorAll('style').forEach(e=>e.type==='0'?e.type='':e.type=0);
  69. }
  70. sohe(...args){//show or hide elements
  71. args.forEach(e=>{
  72. if(typeof e!=="string") e.style.display==='none'?e.style.display='initial':e.style.display='none';
  73. else document.querySelectorAll(e).forEach(e=>e.style.display==='none'?e.style.display='initial':e.style.display='none');
  74. });
  75. }
  76. s2d(seconds){//seconds2date
  77. const date=new Date(seconds),year=date.getFullYear(),month=date.getMonth()+1,day=date.getDate(),
  78. hour=date.getHours(),minute=date.getMinutes(),second=date.getSeconds(),milliseconds=date.getMilliseconds(),currentTime=year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+":"+milliseconds;
  79. return currentTime;
  80. }//my.s2d(new Date().getTime())
  81. tieba(uname,pwd){
  82. document.querySelector('[name="userName"]').value=uname;
  83. document.querySelector('[name="password"]').value=pwd;
  84. return document.querySelector('[value="登录"]').click();
  85. }
  86. fixTitle(){//stop title be changed
  87. Object.defineProperty(document,"title",{
  88. writable:false
  89. });
  90. }
  91. addBtns(...args){//depend:addStyle,append
  92. const len=args.length;
  93. for(let i=0;i<len;i++){
  94. const btn= this.append('input',myBtns,'','type','button','class','my-btn','value',args[i].name+' ');
  95. btn.addEventListener('click',args[i]);
  96. }
  97. return myBtns;
  98. }//my.addBtns(()=>{},e=>{confirm(e.target.id)},function(e){prompt(e.target.outerHTML)},function test(e){return 1})
  99. addAs(...args){//depend:addStyle,append
  100. const len=args.length;
  101. for(let i=0;i<args.length;i+=2){
  102. this.append('a',myBtns,args[i]+'|',`href`,args[i+1],'class','my-btn');
  103. }
  104. }//my.addAs("bilibili","https://www.bilibili.com/","baidu","https://www.baidu.com/")
  105. bindDrag(ele){//鼠标拖动
  106. ele.onmousedown=function(ev){
  107. //if(ev.target.tagName==='TEXTAREA') return;
  108. const diffX=ev.clientX-ele.offsetLeft,diffY=ev.clientY-ele.offsetTop,iw=win.innerWidth,ih=win.innerHeight;
  109. document.onmousemove=function(ev){
  110. let moveX=ev.clientX-diffX,moveY=ev.clientY-diffY;
  111. moveX<0?moveX=0:moveX>iw-ele.offsetWidth?moveX=iw-ele.offsetWidth:0
  112. moveY<0?moveY=0:moveY>ih-ele.offsetHeight?moveY=ih-ele.offsetHeight:0;
  113. ele.style.left=moveX/iw*100+'%'//moveX + 'px';
  114. ele.style.top=moveY/ih*100+'%'//moveY + 'px'
  115. }
  116. document.onmouseup=function(ev){
  117. this.onmousemove=null;
  118. this.onmouseup=null;
  119. }
  120. }
  121. }
  122. sleep(time){
  123. return new Promise((resolve) => setTimeout(resolve, time));
  124. }
  125. waitForElement(selector, timeout = 3e4) {//查找ele
  126. return new Promise((resolve, reject) => {
  127. const intervalTime = 500;
  128. const startTime = Date.now();
  129. const interval = setInterval(() => {
  130. const element = document.querySelector(selector);
  131. if (element) {
  132. clearInterval(interval);
  133. resolve(element);//找到则返回函数
  134. } else if (Date.now() - startTime > timeout) {
  135. clearInterval(interval);
  136. reject(`Timeout waiting for element ${selector}`);//超时则返回字符串
  137. }//继续寻找
  138. }, intervalTime);
  139. });
  140. }
  141. waitForElements(selector, timeout = 3e4) {//查找eles
  142. return new Promise((resolve, reject) => {
  143. const intervalTime = 500;
  144. const startTime = Date.now();
  145. const interval = setInterval(() => {
  146. const elements = document.querySelectorAll(selector);
  147. if (elements) {
  148. clearInterval(interval);
  149. resolve(elements);//找到则返回函数
  150. } else if (Date.now() - startTime > timeout) {
  151. clearInterval(interval);
  152. reject(`Timeout waiting for element ${selector}`);//超时则返回字符串
  153. }//继续寻找
  154. }, intervalTime);
  155. });
  156. }
  157. }()
  158. })(unsafeWindow);