Auto Reload

网页定时自动刷新

  1. // ==UserScript==
  2. // @name Auto Reload
  3. // @name:zh-CN 自动刷新
  4. // @namespace http://tampermonkey.net/
  5. // @description 网页定时自动刷新
  6. // @description:zh-CN 网页定时自动刷新
  7. // @author XVCoder
  8. // @license GPL-3.0-only
  9. // @create 2020-11-20
  10. // @lastmodified 2021-03-02
  11. // @version 0.10
  12. // @match http*://*/*
  13. // @icon https://blog.solutionx.top/assets/img/favicon.png
  14. // @require https://cdn.staticfile.org/vue/2.6.11/vue.js
  15. // @require https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js
  16. // @note 2021-03-02 v0.10 修复 自定义倒计时时间选项无效的bug
  17. // @note 2020-11-23 v0.9 修复 倒计时bug
  18. // @note 2020-11-21 v0.8 优化 显示效果
  19. // @note 2020-11-20 v0.7 修改 信息完善,脚本源迁移到GitHub
  20. // @note 2020-11-20 v0.6 修改 默认匹配所有网页,修改match以指定需要自动刷新的网页
  21. // @note 2020-11-20 v0.5 新增 实现基本功能
  22. // @home-url https://gf.qytechs.cn/zh-CN/scripts/416449-auto-reload
  23. // @home-url2 https://github.com/XVCoder/UserScripts/blob/main/AutoReload/AutoReload.user.js
  24. // @homepageURL https://gf.qytechs.cn/zh-CN/scripts/416449-auto-reload
  25. // @grant GM_getValue
  26. // @grant GM.getValue
  27. // @grant GM_setValue
  28. // @grant GM.setValue
  29. // ==/UserScript==
  30.  
  31. !function () {
  32. let isdebug = false;//是否为调试模式
  33. let isLocalDebug = isdebug || false;
  34. //调试模式时,使用「debug("message");」输出到Console中
  35. let debug = isdebug ? console.log.bind(console) : function () {
  36. };
  37. if (typeof (GM) === "undefined") {
  38. // 这个是ViolentMonkey的支持选项
  39. GM = {};
  40. GM.setValue = GM_setValue;
  41. GM.getValue = GM_getValue;
  42. }
  43. //默认配置
  44. let DefaultConfig = { countDown: 1, selectedOption: 5 };
  45. //可重载的配置文件
  46. let DBConfig = {};
  47. debug("============ Auto Load Start============");
  48. (function () {
  49. let needDisplayNewFun = true; // 本次更新是否有新功能需要展示
  50. if (window.NodeList && !NodeList.prototype.forEach) {
  51. NodeList.prototype.forEach = function (callback, thisArg) {
  52. thisArg = thisArg || window;
  53. for (var i = 0; i < this.length; i++) {
  54. callback.call(thisArg, this[i], i, this);
  55. }
  56. };
  57. }
  58. /**初始化所有的设置**/
  59. Promise.all([GM.getValue("Config")]).then(function (data) {
  60. if (data[0] != null) {
  61. DBConfig = JSON.parse(data[0]);
  62. } else {
  63. DBConfig = DefaultConfig;
  64. }
  65. callback();
  66. }).catch(function (except) {
  67. console.log(except);
  68. });
  69. function callback() {
  70. //=============================================== 固定配置项 ↓↓↓↓↓
  71. //选项被选中时的标志
  72. let optSelectedMark = "✔";//✔
  73. //重载提示
  74. let reloadHint = "reload: ";//
  75. //播放符号
  76. let playMark = "▶";
  77. //暂停符号
  78. let pauseMark = "❙❙";
  79. //显示符号
  80. let visibleMark = "❮";//⍇⇱❮
  81. //隐藏符号
  82. let unvisibleMark = "❯";//⍈⇲❯
  83. //设置符号
  84. let settingMark = "⚙";//🕓⏱🛠⚙
  85. //设置选项圆角曲率(默认5)
  86. let settingOptsRadius = 3;
  87. //设置菜单宽度(单位px;默认45)
  88. let settingMenuWidth = 45;
  89. //用户脚本加载等待时间
  90. let loadTime = 200;
  91. //倒计时选项(时长:min 可为小数)
  92. let opts = {
  93. opt1: 5,
  94. opt2: 4,
  95. opt3: 3,
  96. opt4: 2,
  97. opt5: 1
  98. }
  99. //倒计时选项显示内容
  100. let optsDisplay = {
  101. opt1: opts.opt1 + "min ",
  102. opt2: opts.opt2 + "min ",
  103. opt3: opts.opt3 + "min ",
  104. opt4: opts.opt4 + "min ",
  105. opt5: opts.opt5 + "min ",
  106. };
  107. //=============================================== 固定配置项 ↑↑↑↑↑
  108. //页面重新加载倒计时(秒)
  109. let seconds = 0;
  110. //计时器
  111. let timer = null;
  112. //显示当前倒计时选项的配置
  113. switch (DBConfig.selectedOption) {
  114. case 1: {
  115. //option1
  116. optsDisplay.opt1 += optSelectedMark;
  117. seconds = opts.opt1 * 60;
  118. break;
  119. }
  120. case 2: {
  121. //option2
  122. optsDisplay.opt2 += optSelectedMark;
  123. seconds = opts.opt2 * 60;
  124. break;
  125. }
  126. case 3: {
  127. //option3
  128. optsDisplay.opt3 += optSelectedMark;
  129. seconds = opts.opt3 * 60;
  130. break;
  131. }
  132. case 4: {
  133. //option4
  134. optsDisplay.opt4 += optSelectedMark;
  135. seconds = opts.opt4 * 60;
  136. break;
  137. }
  138. case 5: {
  139. //option5
  140. optsDisplay.opt5 += optSelectedMark;
  141. seconds = opts.opt5 * 60;
  142. break;
  143. }
  144. default:
  145. break;
  146. }
  147.  
  148. setTimeout(function () {
  149. //===============================================================附加样式表=======================================================================
  150. var style = document.createElement("style");
  151. style.innerHTML =
  152. ''
  153. + '.leftTime {color:#00000077;font-size:12px;position:absolute;bottom:0px;right:25px;}'
  154. + '.pauseBtn {position:absolute;bottom:0px;right:100px;background:transparent;display:inline-block;cursor:pointer;color:#666666;font-family:Arial;font-size:8px;font-weight:bold;padding:0px 1px;text-decoration:none;}'
  155. + '.xDropdown {position:absolute;bottom:0px;right:120px;background:transparent;display:inline-block;}'
  156. + '.settingBtn {cursor:pointer;color:#666666;line-height:17px;font-family:Arial;font-size:14px;font-weight:bold;text-decoration:none;cursor:pointer;}'
  157. + '.xDropdown-content {display:none;position:absolute;border-radius:' + settingOptsRadius + 'px;background-color:#f9f9f9;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);}'
  158. + '.xDropdown-content div {-moz-user-select:none;-webkit-user-select:none;user-select:none;min-width:' + settingMenuWidth + 'px;padding:2px 10px 2px 14px;border-radius:' + settingOptsRadius + 'px;font-family:Arial;font-size:10px;corlor:00000077;text-decoration:none;display:block;cursor:arror;}'
  159. + '.xDropdown-content div:hover {background-color:#B1B1B1;color:white}'
  160. + '.xDropdown:hover .xDropdown-content {display:block;bottom:15px}'
  161. + '.xDropdown:hover .settingBtn {color:orange;}'
  162. + '.hiddenBtn {position:absolute;bottom:0px;right:140px;background:transparent;display:inline-block;cursor:pointer;color:#666666;font-family:Arial;font-size:8px;padding:0px 1px;text-decoration:none;}'
  163. + ''
  164. ;
  165. document.getElementsByTagName('HEAD').item(0).appendChild(style);
  166.  
  167. //================================================================附加元素========================================================================
  168. //倒计时标签
  169. let leftTimeDiv = document.createElement("div");
  170. leftTimeDiv.setAttribute("id", "leftTime");
  171. leftTimeDiv.className = "leftTime";
  172. leftTimeDiv.innerHTML = reloadHint + Math.floor(seconds / 60).toString().padStart(2, '0') + ":" + (seconds % 60).toString().padStart(2, '0');
  173. document.body.appendChild(leftTimeDiv);
  174. //[暂停/继续]按钮
  175. let pauseBtn = document.createElement("div");
  176. pauseBtn.setAttribute("id", "pauseBtn");
  177. pauseBtn.className = "pauseBtn";
  178. pauseBtn.innerHTML = pauseMark;
  179. document.body.appendChild(pauseBtn);
  180. //下拉菜单区域
  181. let xDropdownDiv = document.createElement("div");
  182. xDropdownDiv.setAttribute("id", "xDropdown");
  183. xDropdownDiv.className = "xDropdown";
  184. document.body.appendChild(xDropdownDiv);
  185. //下拉菜单主体
  186. let xDropdownContentDiv = document.createElement("div");
  187. xDropdownContentDiv.setAttribute("id", "xDropdown-content");
  188. xDropdownContentDiv.className = "xDropdown-content";
  189. xDropdownContentDiv.innerHTML =
  190. ""
  191. + "<div id='opt1'>" + optsDisplay.opt1 + "</div>"
  192. + "<div id='opt2'>" + optsDisplay.opt2 + "</div>"
  193. + "<div id='opt3'>" + optsDisplay.opt3 + "</div>"
  194. + "<div id='opt4'>" + optsDisplay.opt4 + "</div>"
  195. + "<div id='opt5'>" + optsDisplay.opt5 + "</div>"
  196. + "";
  197. xDropdownContentDiv.style.visibility = "hidden";
  198. xDropdownDiv.appendChild(xDropdownContentDiv);
  199. //设置按钮
  200. let settingBtn = document.createElement("div");
  201. settingBtn.setAttribute("id", "settingBtn");
  202. settingBtn.className = "settingBtn";
  203. settingBtn.style.visibility = "hidden";
  204. settingBtn.innerHTML = settingMark;
  205. xDropdownDiv.appendChild(settingBtn);
  206. //显示/隐藏按钮
  207. let hiddenBtn = document.createElement("div")
  208. hiddenBtn.setAttribute("id", "hiddenBtn");
  209. hiddenBtn.className = "hiddenBtn";
  210. hiddenBtn.style.visibility = "hidden";
  211. hiddenBtn.innerHTML = unvisibleMark;
  212. document.body.appendChild(hiddenBtn);
  213.  
  214. //================================================================事件========================================================================
  215. /**
  216. * 倒计时刷新
  217. */
  218. timer = setInterval(function () {
  219. if (seconds <= 0) {
  220. //倒计时结束,重载页面
  221. location.reload();
  222. } else {
  223. seconds--;
  224. document.getElementById("leftTime").innerHTML = reloadHint + Math.floor(seconds / 60).toString().padStart(2, '0') + ":" + (seconds % 60).toString().padStart(2, '0');
  225. }
  226. }, 1000);
  227.  
  228. /**
  229. * 显示隐藏按钮点击事件
  230. */
  231. document.getElementById("hiddenBtn").addEventListener("click", (function () {
  232. if (hiddenBtn.innerHTML == unvisibleMark) {//隐藏倒计时
  233. hiddenBtn.innerHTML = visibleMark;
  234. hiddenBtn.style.right = "20px";
  235. pauseBtn.style.visibility = "hidden";
  236. leftTimeDiv.style.visibility = "hidden";
  237. settingBtn.style.visibility = "hidden";
  238. xDropdownContentDiv.style.visibility = "hidden";
  239. }
  240. else {//显示倒计时
  241. hiddenBtn.innerHTML = unvisibleMark;
  242. hiddenBtn.style.right = "140px";
  243. pauseBtn.style.visibility = "visible";
  244. leftTimeDiv.style.visibility = "visible";
  245. settingBtn.style.visibility = "visible";
  246. xDropdownContentDiv.style.visibility = "visible";
  247. }
  248. }));
  249.  
  250. /**
  251. * 设置按钮点击事件
  252. */
  253. document.getElementById("settingBtn").addEventListener("click", (function () {
  254. //切换倒计时的时长
  255. }));
  256.  
  257. /**
  258. * [暂停/继续]按钮点击事件
  259. */
  260. document.getElementById("pauseBtn").addEventListener("click", (function () {
  261. if (pauseBtn.innerHTML == pauseMark) {//暂停倒计时
  262. pauseBtn.innerHTML = playMark;
  263. pauseBtn.style.color = "salmon";
  264. hiddenBtn.innerHTML = unvisibleMark;
  265. hiddenBtn.style.visibility = "visible";
  266. settingBtn.style.visibility = "visible";
  267. xDropdownContentDiv.style.visibility = "visible";
  268. clearInterval(timer);
  269. }
  270. else {//继续倒计时
  271. pauseBtn.innerHTML = pauseMark;
  272. pauseBtn.style.color = "#666666";
  273. hiddenBtn.innerHTML = visibleMark;
  274. hiddenBtn.style.visibility = "hidden";
  275. settingBtn.style.visibility = "hidden";
  276. xDropdownContentDiv.style.visibility = "hidden";
  277. timer = setInterval(function () {
  278. if (seconds <= 0) {
  279. //倒计时结束,重载页面
  280. location.reload();
  281. } else {
  282. seconds--;
  283. document.getElementById("leftTime").innerHTML = reloadHint + Math.floor(seconds / 60).toString().padStart(2, '0') + ":" + (seconds % 60).toString().padStart(2, '0');
  284. }
  285. }, 1000);
  286. }
  287. }));
  288. /**
  289. * 选项1
  290. */
  291. document.getElementById("opt1").addEventListener("click", (function (e) {
  292. DBConfig.selectedOption = 1;
  293. setCountDown(e, 1, opts.opt1);
  294. }));
  295. /**
  296. * 选项2
  297. */
  298. document.getElementById("opt2").addEventListener("click", (function (e) {
  299. DBConfig.selectedOption = 2;
  300. setCountDown(e, 2, opts.opt2);
  301. }));
  302. /**
  303. * 选项3
  304. */
  305. document.getElementById("opt3").addEventListener("click", (function (e) {
  306. DBConfig.selectedOption = 3;
  307. setCountDown(e, 3, opts.opt3);
  308. }));
  309. /**
  310. * 选项4
  311. */
  312. document.getElementById("opt4").addEventListener("click", (function (e) {
  313. DBConfig.selectedOption = 4;
  314. setCountDown(e, 4, opts.opt4);
  315. }));
  316. /**
  317. * 选项5
  318. */
  319. document.getElementById("opt5").addEventListener("click", (function (e) {
  320. DBConfig.selectedOption = 5;
  321. setCountDown(e, 5, opts.opt5);
  322. }));
  323. /**
  324. * 设置倒计时
  325. * @param e Element(选项标签)
  326. * @param opt 选项
  327. * @param newCountDown 倒计时时长
  328. */
  329. function setCountDown(e, opt, newCountDown) {
  330. //更新选中项
  331. for (var key in optsDisplay) {
  332. document.getElementById(key).innerHTML = optsDisplay[key] = optsDisplay[key].replace(optSelectedMark, "");
  333. }
  334. e.path[0].innerHTML = (optsDisplay["opt" + opt] += optSelectedMark);
  335. debug("======================= change countdown =======================")
  336. debug(e.path[0].innerHTML)
  337. //更新倒计时
  338. seconds = newCountDown * 60;
  339. document.getElementById("leftTime").innerHTML = reloadHint + Math.floor(seconds / 60).toString().padStart(2, '0') + ":" + (seconds % 60).toString().padStart(2, '0');
  340. DBConfig.countDown = newCountDown;
  341. GM_setValue("Config", JSON.stringify(DBConfig));
  342. }
  343. }, 100);
  344. }
  345. })();
  346. }();

QingJ © 2025

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