mylib

我的工具

当前为 2024-07-30 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/435697/1419477/mylib.js

  1. // ==UserScript==
  2. // @name mylib
  3. // @description 我的工具
  4. // @grant GM_setValue
  5. // @grant GM_getValue
  6. // ==/UserScript==
  7. ;(function(win){
  8. const My =function(){//构造函数,需配合实例方法,与this,prototype有关
  9. const e=document.documentElement.firstElementChild,sv=GM_setValue,gv=GM_getValue;
  10. if(e.tagName==='Z'){
  11. My.zone=e;
  12. My.btns=e.querySelector('my-btns');
  13. }else {
  14. win.cl=win.console.log;win.al=win.alert; // win.gv=gv;win.sv=sv
  15. My.zone=My.before('z',e,'',`class`,'rwf');
  16. My.addStyle(`my-a{border-style: inset}my-btns{display:block;z-index:9195129;position:fixed;height: min-content;}.my-btn{user-select: none;font-size: initial !important;}`,'my-btns');
  17. My.btns=My.append('my-btns',My.zone,'',`class`,'rwf');
  18. if(!gv('fixbar',0)||win.top!==win.self){//如果不固定,或在iframe
  19. My.prototype.bindDrag(My.btns);
  20. }
  21. if(win.top===win.self){
  22. My.btns.onmouseup=e=>{
  23. sv('left',My.btns.style.left);
  24. sv('top',My.btns.style.top);
  25. }
  26. }
  27. My.btns.style.left=gv('left',0);
  28. My.btns.style.top=gv('top',0);
  29. My.addBtns(function 拽(){}).children[0].oncontextmenu=e=>{//右键 固定/不固定 按钮组
  30. e.preventDefault();//取消默认
  31. sv('fixbar',gv('fixbar')?0:1);
  32. location.reload();
  33. }
  34. }
  35. return My;
  36. }
  37. //My.静态方法 My.prototype实例方法(如本案例中my.prototype.constructor.toString())
  38. My.addStyle=function(css,className='rwf'){//function和lambda this指向不同,后者没有prototype、arguments,后者不能new/作为构造函数,
  39. return My.append('style',My.zone,css,`class`,className);
  40. }
  41. My.append=function(...args){//my.append('tag',document.body,'content','idk','true','data-s')
  42. const [tagName, targetEle, innerHTML, ...attributes]=args;
  43. const ele=document.createElement(tagName);
  44. ele.innerHTML=innerHTML;
  45. for (let i=0; i < attributes.length; i += 2) ele.setAttribute(attributes[i], attributes[i + 1]);
  46. targetEle.append(ele);
  47. ele.on = function (event, handler) {
  48. this.addEventListener(event, handler);
  49. return this; // 支持链式调用
  50. };
  51. return ele;
  52. }
  53. My.after=function(...args){//my.after('div',document.body,'','suck','1','dick',000)
  54. const [tagName, targetEle, innerHTML, ...attributes]=args;
  55. const ele=document.createElement(tagName);
  56. ele.innerHTML=innerHTML;
  57. for (let i=0; i < attributes.length; i += 2)ele.setAttribute(attributes[i], attributes[i + 1]);
  58. targetEle.after(ele);
  59. ele.on = function (event, handler) {
  60. this.addEventListener(event, handler);
  61. return this; // 支持链式调用
  62. };
  63. return ele;
  64. }
  65. My.before=(...args)=>{// my.before('div',document.head,'','suck','1','dick')
  66. const [tagName, targetEle, innerHTML, ...attributes]=args;
  67. const ele=document.createElement(tagName);
  68. ele.innerHTML=innerHTML;
  69. for (let i=0; i < attributes.length; i += 2) ele.setAttribute(attributes[i], attributes[i + 1]);
  70. targetEle.before(ele);
  71. ele.on = function (event, handler) {
  72. this.addEventListener(event, handler);
  73. return this; // 支持链式调用
  74. };
  75. return ele;
  76. }
  77. My.addBtns=(...args)=>{//my.addBtns(()=>{},e=>{confirm(e.target.id)},function(e){prompt(e.target.outerHTML)},function test(e){return 1})
  78. const len=args.length;
  79. for(let i=0;i<len;i++){
  80. const btn= My.append('input',My.btns,'','type','button','class','my-btn','value',args[i].name);
  81. btn.addEventListener('click',args[i]);
  82. }
  83. return My.btns;
  84. }
  85. My.eods=()=>{//enable or disable style in My.zone
  86. My.zone.querySelectorAll('style').forEach(e=>{
  87. e.type==='0'?e.type='':0
  88. });
  89. }
  90. My.sohe=(...args)=>{//show or hide elements
  91. args.forEach(e=>{
  92. if(typeof e!=="string") e.style.display==='none'?e.style.display='initial':'none';
  93. else {
  94. document.querySelectorAll(e).forEach(e=>{
  95. e.style.display==='none'?e.style.display='initial':'none'
  96. });
  97. }
  98. });
  99. }
  100. My.s2d=(seconds)=>{//seconds2date//my.s2d(new Date().getTime())
  101. const date=new Date(seconds),year=date.getFullYear(),month=date.getMonth()+1,day=date.getDate(),
  102. hour=date.getHours(),minute=date.getMinutes(),second=date.getSeconds(),milliseconds=date.getMilliseconds(),currentTime=year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+":"+milliseconds;
  103. return currentTime;
  104. }
  105. My.tieba=(uname,pwd)=>{
  106. document.querySelector('[name="userName"]').value=uname;
  107. document.querySelector('[name="password"]').value=pwd;
  108. return document.querySelector('[value="登录"]').click();
  109. }
  110. My.fixTitle=()=>{//disable title change
  111. Object.defineProperty(document,"title",{
  112. writable:false
  113. });
  114. }
  115. My.addAs=(...urls) => {//my.addAs("https://www.bilibili.com/","https://www.baidu.com/")
  116. return urls.map(url => {
  117. const match = url.match(/:\/\/(www\.)?([^\/]+)/);
  118. if (match && match[2]) {
  119. const domainParts = match[2].split('.'),name=domainParts.length > 1 ? domainParts.slice(0, -1).join('.') : url=domainParts[0];
  120. My.append('a',My.btns,name,`href`,url,'class','my-a');
  121. }
  122. return null;
  123. });
  124. }
  125. My.prototype.bindDrag=(ele)=>{//鼠标拖动
  126. ele.onmousedown=function(ev){//if(ev.target.tagName==='TEXTAREA') return;
  127. const diffX=ev.clientX-ele.offsetLeft,diffY=ev.clientY-ele.offsetTop,iw=win.innerWidth,ih=win.innerHeight;
  128. document.onmousemove=function(ev){
  129. let moveX=ev.clientX-diffX,moveY=ev.clientY-diffY;
  130. moveX<0?moveX=0:moveX>iw-ele.offsetWidth?moveX=iw-ele.offsetWidth:0
  131. moveY<0?moveY=0:moveY>ih-ele.offsetHeight?moveY=ih-ele.offsetHeight:0;
  132. ele.style.left=moveX/iw*100+'%'//moveX + 'px';
  133. ele.style.top=moveY/ih*100+'%'//moveY + 'px'
  134. }
  135. document.onmouseup=function(ev){
  136. this.onmousemove=null;
  137. this.onmouseup=null;
  138. }
  139. }
  140. }
  141. My.sleep=(time)=>{
  142. return new Promise((resolve) => setTimeout(resolve, time));
  143. }
  144. My.waitForElement=(selector,timeout=3e4)=>{//查找ele.30000
  145. return new Promise((resolve, reject) => {
  146. const intervalTime=500;
  147. const startTime=Date.now();
  148. const interval=setInterval(() => {
  149. const element=document.querySelector(selector);
  150. if (element) {
  151. clearInterval(interval);
  152. resolve(element);//找到则返回函数
  153. } else if (Date.now() - startTime > timeout) {
  154. clearInterval(interval);
  155. reject(`Timeout waiting for element ${selector}`);//超时则返回字符串
  156. }//继续寻找
  157. }, intervalTime);
  158. });
  159. }
  160. My.waitForElements=(selector,timeout=3e4)=>{//查找eles
  161. return new Promise((resolve, reject) => {
  162. const intervalTime=500,startTime=Date.now(),interval=setInterval(() => {
  163. const elements=document.querySelectorAll(selector);
  164. if (elements) {
  165. clearInterval(interval);
  166. resolve(elements);//找到则返回函数
  167. } else if (Date.now() - startTime > timeout) {
  168. clearInterval(interval);
  169. reject(`Timeout waiting for element ${selector}`);//超时则返回字符串
  170. }//继续寻找
  171. }, intervalTime);
  172. });
  173. }
  174. win.my=new My();
  175. })(unsafeWindow);