您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
测试
当前为
// ==UserScript== // @name 保存测试 // @namespace http://tampermonkey.net/ // @version 8.2 // @license MIT // @description 测试 // @author 从前跟你一样 // @grant unsafeWindow // @match *://*/* // @require https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js // @connect vagrantup.com // @grant unsafeWindow // @grant GM_xmlhttpRequest // @connect 192.168.10.2 // @connect novelai.net // @match *://*/* // @description Save user settings // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // ==/UserScript== // ==/UserScript== (function() { 'use strict'; let isDragging = null; const ICON_URL = 'https://internal-api-drive-stream-sg.larksuite.com/space/api/box/stream/download/v2/cover/QHspbh93roP3BtxYKSelqvZvgGf/?fallback_source=1&height=1280&mount_node_token=A76Yd1rjgo4Bavxu183lE7j7gIh&mount_point=docx_image&policy=equal&width=1280'; // let iconData = GM_getValue('iconData', null); let iconData = "data:image/gif;base64,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" // 下载并保存图标 function downloadAndSaveIcon() { GM_xmlhttpRequest({ method: 'GET', url: ICON_URL, responseType: 'blob', onload: function(response) { let reader = new FileReader(); reader.onloadend = function() { iconData = reader.result; GM_setValue('iconData', iconData); createSettingsIcon(iconData); }; reader.readAsDataURL(response.response); } }); } function createSettingsIcon(iconSrc) { const icon = document.createElement('img'); icon.src = iconSrc; icon.style.position = 'fixed'; icon.style.top = '50%'; icon.style.right = '0'; icon.style.transform = 'translateY(-50%)'; icon.style.width = '30px'; icon.style.height = '30px'; icon.style.cursor = 'pointer'; icon.style.zIndex = '9999'; icon.style.transition = 'right 0.3s'; let hideTimeout; function snapToRight() { icon.style.right = '0'; icon.style.left = 'auto'; clearTimeout(hideTimeout); hideTimeout = setTimeout(() => { icon.style.right = '-20px'; }, 2000); } function showIcon() { icon.style.right = '0'; clearTimeout(hideTimeout); } function hideIcon() { hideTimeout = setTimeout(() => { icon.style.right = '-20px'; }, 1000); } icon.addEventListener('mouseenter', showIcon); icon.addEventListener('mouseleave', hideIcon); icon.addEventListener('mousedown', (e) => { isDragging = e.clientX; }) // 修改点击事件处理 icon.addEventListener('mouseup', (e) => { if (e.clientX==isDragging) { openSettingsPanel(); } }) ; makeDraggable(icon, () => { snapToRight(); }); function makeDraggable(element, callback) { let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; element.onmousedown = dragMouseDown; function dragMouseDown(e) { e = e || window.event; e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; document.onmousemove = elementDrag; } function elementDrag(e) { e = e || window.event; e.preventDefault(); pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; element.style.top = (element.offsetTop - pos2) + "px"; element.style.left = (element.offsetLeft - pos1) + "px"; element.style.right = 'auto'; } function closeDragElement() { document.onmouseup = null; document.onmousemove = null; if (callback) callback(); } } document.body.appendChild(icon); hideIcon(); // 初始状态为隐藏 } // 创建设置面板 function createSettingsPanel() { const panel = document.createElement('div'); panel.style.position = 'fixed'; panel.style.top = '50%'; panel.style.left = '50%'; panel.style.transform = 'translate(-50%, -50%)'; panel.style.backgroundColor = 'white'; panel.style.padding = '20px'; panel.style.border = '1px solid black'; panel.style.zIndex = '10000'; panel.style.display = 'none'; const input = document.createElement('input'); input.type = 'text'; input.value = GM_getValue('userSetting', ''); const saveButton = document.createElement('button'); saveButton.textContent = '保存设置'; saveButton.onclick = saveSetting; panel.appendChild(input); panel.appendChild(saveButton); document.body.appendChild(panel); return panel; } // 打开设置面板 function openSettingsPanel() { settingsPanel.style.display = 'block'; } // 保存设置 function saveSetting() { const input = settingsPanel.querySelector('input'); GM_setValue('userSetting', input.value); settingsPanel.style.display = 'none'; } // 初始化 if (iconData) { createSettingsIcon(iconData); } else { downloadAndSaveIcon(); } const settingsPanel = createSettingsPanel(); // Your code here... })();