您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
取消复制限制;选择题显示序号(一般情况最小的几个是答案);跳过强制等待;双击单行或块代码区域复制代码
当前为
// ==UserScript== // @name 计蒜客助手 Jisuanke Helper // @namespace http://tampermonkey.net/ // @version 0.4 // @description 取消复制限制;选择题显示序号(一般情况最小的几个是答案);跳过强制等待;双击单行或块代码区域复制代码 // @author yusanshi // @match http://www.jisuanke.com/course/* // @match https://www.jisuanke.com/course/* // @grant none // @run-at document-start // @require https://cdn.jsdelivr.net/gh/colxi/getEventListeners/src/getEventListeners.min.js // ==/UserScript== (function () { 'use strict'; setInterval(() => { // remove disabled and oncopy attribute continually removeCls('jsk-disabled'); for (let elem of ['disabled', 'oncopy', 'oncut']) { removeAttr(elem); } // delete line numbers to avoid its being copied for (let selector of ['#guide .CodeMirror-linenumber', '#hint .CodeMirror-linenumber']) { for (let elem of document.querySelectorAll(selector)) { elem.remove(); } } // remove mousedown event handler for (let selector of ['#guide .CodeMirror-scroll', '#lint .CodeMirror-scroll']) { for (let elem of document.querySelectorAll(selector)) { customRemoveEventLister(elem, 'mousedown'); } } // remove selectstart event handler for (let selector of ['#guide .CodeMirror-lines', '#lint .CodeMirror-lines']) { for (let elem of document.querySelectorAll(selector)) { customRemoveEventLister(elem.querySelector('div'), 'selectstart'); } } // skip waiting for (let elem of document.querySelectorAll('[data-unlocked]')) { elem.setAttribute('data-unlocked', '100'); } // double click to copy for (let selector of ['code', '.CodeMirror-scroll']) { for (let elem of document.querySelectorAll(selector)) { elem.ondblclick = () => { copyTextToClipboard(elem.innerText); } } } }, 500); window.onload = () => { // add number prompts for multiple choice problem for (let elem of document.querySelectorAll('[num]')) { const span = document.createElement('span'); span.style.color = 'green'; span.innerText = elem.getAttribute('num'); elem.insertAdjacentElement('afterbegin', span); } } function customRemoveEventLister(target, listenerType) { for (let event of target.getEventListeners(listenerType)) { target.removeEventListener(event.type, event.listener, event.useCapture); } } function removeCls(cls) { for (let elem of document.querySelectorAll(`.${cls}`)) { elem.classList.remove(cls); } } function removeAttr(attr) { for (let elem of document.querySelectorAll(`[${attr}]`)) { elem.removeAttribute(attr); } } // https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript function copyTextToClipboard(text) { if (!navigator.clipboard) { fallbackCopyTextToClipboard(text); return; } navigator.clipboard.writeText(text).then(function () { console.log('Async: Copying to clipboard was successful!'); }, function (err) { console.error('Async: Could not copy text: ', err); }); } function fallbackCopyTextToClipboard(text) { const textArea = document.createElement("textarea"); textArea.value = text; textArea.style.position = "fixed"; //avoid scrolling to bottom document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { const successful = document.execCommand('copy'); const msg = successful ? 'successful' : 'unsuccessful'; console.log('Fallback: Copying text command was ' + msg); } catch (err) { console.error('Fallback: Oops, unable to copy', err); } document.body.removeChild(textArea); } })();