超星允许粘贴

超星学习通允许粘贴

  1. /* eslint-disable no-multi-spaces */
  2.  
  3. // ==UserScript==
  4. // @name 超星允许粘贴
  5. // @name:zh-CN 超星允许粘贴
  6. // @namespace http://tampermonkey.net/
  7. // @version 0.1
  8. // @description 超星学习通允许粘贴
  9. // @description:zh-CN 超星学习通允许粘贴
  10. // @author PY-DNG
  11. // @license GPL-v3
  12. // @match *://*.chaoxing.com/*
  13. // @grant none
  14. // ==/UserScript==
  15.  
  16. (function __MAIN__() {
  17. 'use strict';
  18.  
  19. // DoLog
  20. const LogLevel = {
  21. None: 0,
  22. Error: 1,
  23. Success: 2,
  24. Warning: 3,
  25. Info: 4,
  26. }
  27.  
  28. // Arguments: level=LogLevel.Info, logContent, asObject=false
  29. // Needs one call "DoLog();" to get it initialized before using it!
  30. function DoLog() {
  31. // Get window
  32. const win = (typeof(unsafeWindow) === 'object' && unsafeWindow !== null) ? unsafeWindow : window;
  33.  
  34. const LogLevelMap = {};
  35. LogLevelMap[LogLevel.None] = {
  36. prefix: '',
  37. color: 'color:#ffffff'
  38. }
  39. LogLevelMap[LogLevel.Error] = {
  40. prefix: '[Error]',
  41. color: 'color:#ff0000'
  42. }
  43. LogLevelMap[LogLevel.Success] = {
  44. prefix: '[Success]',
  45. color: 'color:#00aa00'
  46. }
  47. LogLevelMap[LogLevel.Warning] = {
  48. prefix: '[Warning]',
  49. color: 'color:#ffa500'
  50. }
  51. LogLevelMap[LogLevel.Info] = {
  52. prefix: '[Info]',
  53. color: 'color:#888888'
  54. }
  55. LogLevelMap[LogLevel.Elements] = {
  56. prefix: '[Elements]',
  57. color: 'color:#000000'
  58. }
  59.  
  60. // Current log level
  61. DoLog.logLevel = win.isPY_DNG ? LogLevel.Info : LogLevel.Warning; // Info Warning Success Error
  62.  
  63. // Log counter
  64. DoLog.logCount === undefined && (DoLog.logCount = 0);
  65.  
  66. // Get args
  67. let level, logContent, asObject;
  68. switch (arguments.length) {
  69. case 1:
  70. level = LogLevel.Info;
  71. logContent = arguments[0];
  72. asObject = false;
  73. break;
  74. case 2:
  75. level = arguments[0];
  76. logContent = arguments[1];
  77. asObject = false;
  78. break;
  79. case 3:
  80. level = arguments[0];
  81. logContent = arguments[1];
  82. asObject = arguments[2];
  83. break;
  84. default:
  85. level = LogLevel.Info;
  86. logContent = 'DoLog initialized.';
  87. asObject = false;
  88. break;
  89. }
  90.  
  91. // Log when log level permits
  92. if (level <= DoLog.logLevel) {
  93. let msg = '%c' + LogLevelMap[level].prefix + (typeof MODULE_DATA === 'object' ? '[' + MODULE_DATA.name + ']' : '');
  94. let subst = LogLevelMap[level].color;
  95.  
  96. if (asObject) {
  97. msg += ' %o';
  98. } else {
  99. switch (typeof(logContent)) {
  100. case 'string':
  101. msg += ' %s';
  102. break;
  103. case 'number':
  104. msg += ' %d';
  105. break;
  106. case 'object':
  107. msg += ' %o';
  108. break;
  109. }
  110. }
  111.  
  112. if (++DoLog.logCount > 512) {
  113. console.clear();
  114. DoLog.logCount = 0;
  115. }
  116. console.log(msg, subst, logContent);
  117. }
  118. }
  119.  
  120. const dealed = [];
  121. let count = 0;
  122. const interval = setInterval(deal, 1000);
  123.  
  124. function deal() {
  125. // Max: 40 time deals
  126. if (++count > 40) {
  127. clearInterval(interval);
  128. return false;
  129. }
  130.  
  131. // Get iframes & <html>s
  132. const iframes = $All('iframe[id^="ueditor"]');
  133. const htmls = Array.from(iframes).concat([document.head.parentElement]).map((elm) => {
  134. // Repeat check
  135. if (dealed.includes(elm)) {
  136. // Dealed iframe, skip
  137. return false;
  138. } else {
  139. // Push into dealed list
  140. dealed.push(elm);
  141. }
  142.  
  143. // Get <html>
  144. if (elm.contentDocument) {
  145. // Get success
  146. DoLog('success', elm);
  147. const html = elm.contentDocument.head.parentElement;
  148. return html;
  149. } else {
  150. // Get failed (Access denied maybe);
  151. DoLog('denied', elm);
  152. return null;
  153. }
  154. });
  155.  
  156. // Add listener
  157. htmls.forEach((html) => (html && html.addEventListener('paste', function(e) {e.stopImmediatePropagation();}, true)));
  158. htmls.some(h => h) && DoLog(htmls);
  159.  
  160. return true;
  161. }
  162.  
  163. // Basic functions
  164. // querySelector
  165. function $() {
  166. switch(arguments.length) {
  167. case 2:
  168. return arguments[0].querySelector(arguments[1]);
  169. break;
  170. default:
  171. return document.querySelector(arguments[0]);
  172. }
  173. }
  174. // querySelectorAll
  175. function $All() {
  176. switch(arguments.length) {
  177. case 2:
  178. return arguments[0].querySelectorAll(arguments[1]);
  179. break;
  180. default:
  181. return document.querySelectorAll(arguments[0]);
  182. }
  183. }
  184. // createElement
  185. function $CrE() {
  186. switch(arguments.length) {
  187. case 2:
  188. return arguments[0].createElement(arguments[1]);
  189. break;
  190. default:
  191. return document.createElement(arguments[0]);
  192. }
  193. }
  194. })();

QingJ © 2025

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