玩转CSDN

仅供参考学习

当前为 2021-09-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name 玩转CSDN
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1010
  5. // @match *://*.blog.csdn.net/*
  6. // @icon chrome://favicon/http://blog.csdn.net/
  7. // @description 仅供参考学习
  8. // @author w2hi
  9. // @grant GM_setClipboard
  10. // @reference https://source.unsplash.com/random
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15. csdn.copyright.textData = '';
  16. let head_nav_toolbar = document.querySelector('#csdn-toolbar');
  17. // 删除头部广告
  18. head_nav_toolbar.addEventListener("DOMNodeInserted", function() {
  19. if(head_nav_toolbar.firstElementChild.className==='toolbar-advert') head_nav_toolbar.removeChild(head_nav_toolbar.firstElementChild);
  20. });
  21. // 删除登录(不可用)弹窗
  22. document.body.addEventListener("DOMNodeInserted", function() {
  23. // let login = document.body.querySelector('script[src*="login"]');
  24. // login.parentNode.removeChild(login);
  25. document.body.removeChild(document.body.lastElementChild);
  26. document.body.removeChild(document.body.lastElementChild);
  27.  
  28. });
  29. // 删除登录(不可用)悬浮框 [与之前变了花样,设计了iframe与js弹出]
  30. let login = document.querySelector('#app');
  31. if(login!=null)document.body.removeChild(login);
  32. let xx = document.querySelectorAll('a[href*="fn"]')
  33. xx.forEach((item, index)=>{
  34. console.info(item.id);
  35. let node = document.querySelector(`#${item.id}`);
  36. item.removeAttribute('onclick');
  37. item.addEventListener('click',function(){
  38. node.scrollIntoView({ behavior: "smooth" })
  39. });
  40. })
  41. class CSDN{
  42. construct(focusSwitch){
  43. console.log('构造方法');
  44. };
  45. /*
  46. @name 复制
  47. @func
  48. modifyCopyPriviledge: 修改权限
  49. copy: 复制逻辑
  50. */
  51. modifyCopyPriviledge(codeElem,signElem){
  52. //代码容器修改
  53. codeElem.removeAttribute('onclick');
  54. codeElem.style.setProperty('user-select','auto');
  55. codeElem.parentNode.style.setProperty('user-select','auto');
  56. codeElem.parentNode.style.setProperty('margin-bottom','30px');
  57. // 登录(不可用)容器修改
  58. try{
  59. signElem.removeAttribute('onclick');
  60. signElem.setAttribute('data-title','点击复制');
  61. signElem.style.margin = '0';
  62. signElem.style.setProperty('margin-bottom', '40px');
  63. signElem.style.setProperty('max-width','80px');
  64. signElem.style.setProperty('min-height','15px');
  65. signElem.style.setProperty('font-size','15px');
  66. signElem.style.left = '56px';
  67. return true
  68. }catch(e){
  69. return false
  70. }finally{
  71. // 复制按钮位置变化 代码块并列、代码块内、代码块外
  72. codeElem.parentNode.insertBefore(signElem, codeElem);
  73. }
  74. };
  75. copy(signElem) {
  76. let codeelem = null;
  77. try{
  78. codeelem = signElem.parentNode;
  79. if(codeelem.id.indexOf('code')===-1){ // 父节点
  80. throw new EvalError('值错误');
  81. }
  82. }catch(err){// 兄弟节点
  83. codeelem = signElem.previousElementSibling;
  84. }
  85. document.oncopy=function(e){
  86. e.clipboardData.setData('text',codeelem.innerText);
  87. e.preventDefault();
  88. document.oncopy=null;
  89. }
  90. document.execCommand("Copy");// 执行浏览器复制命令
  91. signElem.setAttribute('data-title','复制成功');
  92. signElem.style.cssText += 'background-color: green';
  93. setTimeout(()=>{ // 先延时1000ms,再执行回调函数
  94. signElem.setAttribute('data-title','点击复制');
  95. signElem.style.removeProperty('background-color','green');
  96. },1000);
  97. };
  98. /*
  99. @name 专注模式
  100. @func
  101. modifyFocusPriviledge: 修改专注权限
  102. showFocusModel: 展开专注模式
  103. */
  104. modifyFocusPriviledge(mainBox, main, catalog){
  105. // 修改toolbar
  106. let toolbar = document.querySelector('.csdn-side-toolbar');
  107. toolbar.style.right = "20px";
  108. toolbar.style.position = "fixed";
  109. let listen_op = {attributes:true};
  110. function callback(mutationsList){ // 仅监听属性变化
  111. toolbar.style.left = "";
  112. };
  113. // 创建一个链接到回调函数的观察者实例
  114. var observer = new MutationObserver(callback);
  115. // 开始观察已配置突变的目标节点
  116. observer.observe(toolbar, listen_op);
  117. // 停止观察
  118. // observer.disconnect();
  119. let focusSwitch = document.querySelector('.option-box').cloneNode(true);
  120. focusSwitch.firstElementChild.src = 'https://s1.aigei.com/src/img/png/05/055f0df239ef4451a25be1e5c4617f96.png?imageMogr2/auto-'+
  121. 'orient/thumbnail/!199x199r/gravity/Center/crop/199x199/quality/85/&e=1735488000&'+
  122. 'token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:pxpJ0L3fOUppABVi15gOFs94eqk=';
  123. focusSwitch.style.background = "rgba(0,0,0,0.1)";
  124. focusSwitch.firstElementChild.style.width = "200%";
  125. focusSwitch.firstElementChild.style.display = "block"; // 去除初始鼠标放上有动态加载事件
  126. focusSwitch.removeChild(focusSwitch.lastElementChild);
  127. focusSwitch.removeAttribute('mouseup');
  128. toolbar.replaceChildren(focusSwitch);
  129. toolbar.style.left = '0px';
  130. // 修改默认页面配置样式
  131. main.removeAttribute('id');
  132. mainBox.firstElementChild.nextElementSibling.style.removeProperty('z-index');
  133. main.style.cssText += 'z-index:999;position:absolute';
  134. main.style.display = 'none';
  135. document.body.insertBefore(main, document.body.firstElementChild);
  136. if(catalog!=null){
  137. let pn = catalog.parentNode;
  138. let _catalog = catalog.cloneNode(true);
  139. _catalog.style.cssText += 'z-index:999;position:fixed;background-color: rgba(255,255,255,0.2);position: fixed;top: 80px;color: white;right: 20px;';
  140. _catalog.style.setProperty('max-height','454.5px');
  141. _catalog.firstElementChild.style.setProperty('max-height','inherit');
  142. _catalog.firstElementChild.firstElementChild.style.cssText += 'text-align:center;background:black;color:white';
  143. _catalog.style.display = 'none';
  144. _catalog.removeAttribute('id');
  145. let className = (function(){
  146. let arr = [];
  147. for(let i=0;i<3;i++){
  148. if(pn.className.length){
  149. arr.push(pn.className);
  150. }
  151. pn = pn.parentNode;
  152. }
  153. return arr.join(' ')
  154. })();
  155. _catalog.className += ' ' + className;
  156. document.body.insertBefore(_catalog, document.body.firstElementChild);
  157. return {a: focusSwitch,b: _catalog};
  158. }
  159. return {a:focusSwitch,b:catalog}
  160. };
  161. showFocusModel(status, mainBox, main,catalog){
  162. if(status===0){ // 进入专注模式
  163. console.log(`----${status}: 专注模式----`)
  164. mainBox.style.display = 'none';
  165. mainBox.nextElementSibling.style.display = 'none';
  166. main.style.display = 'block';
  167. if(catalog!=null){
  168. catalog.style.display = 'block';
  169. catalog.setAttribute('id','groupfile');
  170. }
  171. }else{
  172. console.log(`----${status}: 初始模式----`);
  173. mainBox.style.display = 'block';
  174. mainBox.nextElementSibling.style.display = 'block';
  175. main.style.display = 'none';
  176. if(catalog!=null){
  177. catalog.style.display = 'none';
  178. catalog.removeAttribute('id');
  179. }
  180. }
  181. }
  182. };
  183.  
  184. let _csdn = new CSDN();
  185. let mainBox = document.getElementById('mainBox');
  186. let main = mainBox.firstElementChild.cloneNode(true);
  187. let catalog = document.getElementById('groupfile');
  188. let compose = _csdn.modifyFocusPriviledge(mainBox, main, catalog);
  189. let status = -1;
  190. compose.a.addEventListener('click', function(){
  191. status = ~status;
  192. _csdn.showFocusModel(status,mainBox,main,compose.b);
  193. },'true');
  194. let codes = document.querySelectorAll('#content_views pre code');
  195. let signs = document.querySelectorAll('#content_views .signin');
  196. // 解决部分文章允许不登陆复制的脚本定位问题
  197. if(signs.length===0) signs = document.querySelectorAll('#content_views .hljs-button');
  198. for(var i=0;i<codes.length;i++){
  199. let sign = signs[i], code = codes[i];
  200. _csdn.modifyCopyPriviledge(code, sign);
  201. sign.addEventListener('click', function(){
  202. GM_setClipboard(code.innerText, "text");
  203. sign.setAttribute('data-title','复制成功');
  204. sign.style.cssText += 'background-color: green';
  205. setTimeout(()=>{ // 先延时1000ms,再执行回调函数
  206. sign.setAttribute('data-title','点击复制');
  207. sign.style.removeProperty('background-color','green');
  208. },1000);
  209. // _csdn.copy(this);
  210. },'true');
  211. };
  212. })();

QingJ © 2025

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