// ==UserScript== // @name 力扣题目计时 // @description 力扣题目界面显示当前用时, 可也进行倒计时 // @namespace https://greasyfork.org/zh-CN/users/412790 // @version 1.3 // @author Permission // @match https://leetcode-cn.com/problems/* // @match https://leetcode.cn/problems/* // @require https://cdn.jsdelivr.net/npm/sweetalert2@9 // @require https://code.jquery.com/jquery-3.4.1.min.js // @grant GM_addStyle // @grant unsafeWindow // @downloadURL https://update.greasyfork.org/scripts/420311/%E5%8A%9B%E6%89%A3%E9%A2%98%E7%9B%AE%E8%AE%A1%E6%97%B6.user.js // @updateURL https://update.greasyfork.org/scripts/420311/%E5%8A%9B%E6%89%A3%E9%A2%98%E7%9B%AE%E8%AE%A1%E6%97%B6.meta.js // ==/UserScript== /* globals $, jQuery, Swal */ 'use strict'; GM_addStyle(` #lc-timer{ color: green; font-size: 18px; font-family: FetteMittelschrift, sans-serif; margin: 0px 15px 0px 10px; user-select: none; width: 70px; } #reset-timer, #set-timer, #pause-timer, #stop-timer{ border:none; outline:none; user-select: none; box-shadow: inset 0px 0px 0px 1px rgba(var(--grey-4-rgb), 1); background-color: transparent; color: rgba(var(--grey-8-rgb), 1); border-radius: 3px; height: 26px; overflow: hidden; text-overflow: ellipsis; word-break: break-all; white-space: nowrap; } #reset-timer:hover, #set-timer:hover, #pause-timer:hover, #stop-timer:hover{ cursor:pointer; box-shadow: inset 0px 0px 0px 1px rgba(var(--primary-5-rgb), 1); background-color: rgba(var(--primary-0-rgb), 1); color: rgba(var(--grey-8-rgb), 1); } #set-timer, #pause-timer, #stop-timer{ margin-left: 2px; } `) let sec = 0, min = 0, hr = 0; const mode = { normal : "normal", countdown: "countdown", paused : "paused", stoped : "stoped" } let curMode = mode.normal; const updateTimer = () => { if(sec == 59){ sec = 0; if(min == 59){ min = 0; hr++; } else{ min++; } } else{ sec++; } $("#lc-timer").text(`${hr < 10 ? "0" : ""}${hr}:${min < 10 ? "0" : ""}${min}:${sec < 10 ? "0" : ""}${sec}`); } const check = setInterval(() => { if($("#lang-select").length != 0){ $("#lang-select").after(`
`); clearInterval(check); let interval = setInterval(() => updateTimer(), 1e3); bind(interval); } }, 2e2); const bind = (interval) => { $("#reset-timer").bind("click", () => { if(curMode == mode.countdown){ alert("倒计时模式不可重置时间!"); return; } if(curMode != mode.stoped && !confirm("确定要重置?")){ return; } sec = min = hr = 0; clearInterval(interval); $("#lc-timer").text("00:00:00"); curMode = mode.normal; $("#pause-timer").text("当前: 正在计时"); $("#reset-timer").text("重置"); interval = setInterval(() => updateTimer(), 1e3); }) $("#pause-timer").bind("click", () => { if(curMode == mode.countdown){ return; } else if(curMode == mode.normal){ $("#pause-timer").text("当前: 暂停"); clearInterval(interval); curMode = mode.paused; } else if(curMode == mode.paused){ $("#pause-timer").text("当前: 正在计时"); clearInterval(interval); interval = setInterval(() => updateTimer(), 1e3); curMode = mode.normal; } }) $("#stop-timer").bind("click", () => { if(curMode == mode.countdown){ alert("倒计时模式不可停止!"); return; } clearInterval(interval); curMode = mode.stoped; $("#lc-timer").text("00:00:00"); $("#pause-timer").text("当前: 停止"); $("#reset-timer").text("开始"); }) $("#set-timer").bind("click", () => { if(curMode == mode.countdown){ alert("当前正在倒计时模式, 若要重新设置请刷新界面."); return; } Swal.mixin({ input: 'text', confirmButtonText: 'Next →', showCancelButton: true, progressSteps: ['1', '2', '3'] }).queue([ { title: '设置秒' }, { title: '设置分钟' }, { title: '设置小时' } ]).then((result) => { if (result.value) { const choices = result.value; for(let pos = 0; pos < choices.length; pos++){ let a = parseInt(choices[pos]); if(isNaN(a) || ((pos == 0 || pos == 1) && (a < 0 || a >= 60))){ alert(`时间设置有误!`); return; } } Swal.fire({ title: 'All done!', text: `倒计时设置完成`, confirmButtonText: '开始!' }).then(() => { startCountdown(choices, interval); }) } }) }) }; const startCountdown = (choices, interval) => { curMode = mode.countdown; $("#pause-timer").text("当前: 倒计时"); $("#stop-timer").attr("disabled", "true"); $("#pause-timer").attr("disabled", "true"); $("#reset-timer").attr("disabled", "true"); $("#set-timer").attr("disabled", "true"); $("#stop-timer").hide(); $("#set-timer").hide(); $("#reset-timer").hide(); clearInterval(interval); let unload = e => { e.preventDefault(); e.returnValue = ''; }; window.addEventListener('beforeunload', unload); sec = choices[0]; min = choices[1]; hr = choices[2]; const countdownInterval = setInterval(() => { $("#lc-timer").text(`${hr < 10 ? "0" : ""}${hr}:${min < 10 ? "0" : ""}${min}:${sec < 10 ? "0" : ""}${sec}`); if(sec == 0 && min == 0 && hr == 0){ clearInterval(countdownInterval); curMode = mode.stoped; $("#stop-timer").removeAttr("disabled"); $("#pause-timer").removeAttr("disabled"); $("#reset-timer").removeAttr("disabled"); $("#set-timer").removeAttr("disabled"); $("#stop-timer").show(); $("#set-timer").show(); $("#reset-timer").show(); $("#pause-timer").text("当前: 停止"); $("#reset-timer").text("计时"); window.removeEventListener('beforeunload', unload); alert(`倒计时结束`); } if(sec == 0){ sec = 59; if(min == 0){ hr--; min = 59; } else{ min--; } } else{ sec--; } }, 1e3); }