您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Define custom auto-refresh intervals for different websites, and manage them through a settings menu with options to view, modify, or clear.
// ==UserScript== // @name Custom Auto Refresh // @namespace YMHOMER // @version 2.0 // @description Define custom auto-refresh intervals for different websites, and manage them through a settings menu with options to view, modify, or clear. // @match *://*/* // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // ==/UserScript== (function () { 'use strict'; const currentUrl = window.location.href; const currentRoot = window.location.hostname; const defaultRefreshInterval = 0; let allRefreshSettings = GM_getValue('allRefreshSettings', {}); let refreshInterval = allRefreshSettings[currentRoot] || defaultRefreshInterval; let refreshTimer; let manageSettingsDialogOpen = false; const startAutoRefresh = () => { if (refreshInterval > 0 && !manageSettingsDialogOpen) { refreshTimer = setInterval(() => { location.reload(); }, refreshInterval * 1000); } }; const stopAutoRefresh = () => { clearInterval(refreshTimer); }; const showDialog = (title, content, onCloseCallback = null) => { const dialog = document.createElement('div'); dialog.innerHTML = ` <style> .custom-dialog { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); z-index: 10000; max-width: 400px; max-height: 500px; overflow-y: auto; } .custom-dialog input[type="checkbox"] { margin-right: 5px; } .custom-dialog button { margin-top: 10px; } .custom-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9999; } .custom-dialog table { width: 100%; border-collapse: collapse; } .custom-dialog table, .custom-dialog th, .custom-dialog td { border: 1px solid #ccc; } .custom-dialog th, .custom-dialog td { padding: 8px; text-align: left; } </style> <div class="custom-dialog"> <h2>${title}</h2> <div id="dialogContent">${content}</div> </div> <div class="custom-overlay"></div> `; document.body.appendChild(dialog); const overlay = dialog.querySelector('.custom-overlay'); overlay.addEventListener('click', () => { document.body.removeChild(dialog); if (onCloseCallback) onCloseCallback(); }); return dialog.querySelector('.custom-dialog'); }; const refreshManageSettingsDialog = (dialog) => { const siteKeys = Object.keys(allRefreshSettings); let tableRows = siteKeys.map(site => ` <tr> <td>${site}</td> <td>${allRefreshSettings[site]} seconds</td> <td><button class="modifyBtn" data-site="${site}">Modify</button></td> <td><button class="deleteBtn" data-site="${site}">Delete</button></td> </tr> `).join(''); const dialogContent = ` <button id="addSettingBtn">Add New</button> <table> <thead> <tr> <th>Site</th> <th>Refresh Interval</th> <th>Modify</th> <th>Delete</th> </tr> </thead> <tbody>${tableRows}</tbody> </table> `; dialog.querySelector('#dialogContent').innerHTML = dialogContent; bindManageSettingsEvents(dialog); }; const openSettingsDialog = (parentDialog = null) => { stopAutoRefresh(); const dialogContent = ` <label>Enter refresh interval (Seconds):</label> <input type="number" id="intervalInput" value="${refreshInterval}" min="0" /> <br/> <label><input type="checkbox" id="fullUrlCheckbox"> Apply to full URL</label> <button id="saveIntervalBtn">Save</button> `; const dialog = showDialog("Set Refresh Interval", dialogContent); dialog.querySelector('#saveIntervalBtn').addEventListener('click', () => { const intervalInput = dialog.querySelector('#intervalInput').value; const applyToFullUrl = dialog.querySelector('#fullUrlCheckbox').checked; const targetUrl = applyToFullUrl ? currentUrl : currentRoot; if (intervalInput !== null) { refreshInterval = parseInt(intervalInput, 10); allRefreshSettings[targetUrl] = refreshInterval; GM_setValue('allRefreshSettings', allRefreshSettings); document.body.removeChild(dialog.parentNode); startAutoRefresh(); // Refresh Manage Settings dialog if open if (parentDialog) { refreshManageSettingsDialog(parentDialog); } } }); }; const manageAllSettingsDialog = () => { stopAutoRefresh(); manageSettingsDialogOpen = true; const dialog = showDialog("Manage Settings", '', () => { manageSettingsDialogOpen = false; refreshInterval = allRefreshSettings[currentRoot] || defaultRefreshInterval; startAutoRefresh(); }); refreshManageSettingsDialog(dialog); }; const bindManageSettingsEvents = (dialog) => { dialog.querySelector('#addSettingBtn').addEventListener('click', () => openSettingsDialog(dialog)); dialog.querySelectorAll('.modifyBtn').forEach(button => { button.addEventListener('click', () => { const site = button.getAttribute('data-site'); modifySettingDialog(dialog, site); }); }); dialog.querySelectorAll('.deleteBtn').forEach(button => { button.addEventListener('click', () => { const site = button.getAttribute('data-site'); deleteSetting(dialog, site); }); }); }; const modifySettingDialog = (parentDialog, site) => { const currentInterval = allRefreshSettings[site]; const dialogContent = ` <label>Enter new refresh interval (Seconds) for ${site}:</label> <input type="number" id="newIntervalInput" value="${currentInterval}" min="0" /> <button id="saveModifyBtn">Save</button> `; const dialog = showDialog("Modify Refresh Interval", dialogContent); dialog.querySelector('#saveModifyBtn').addEventListener('click', () => { const newInterval = dialog.querySelector('#newIntervalInput').value; if (newInterval !== null) { allRefreshSettings[site] = parseInt(newInterval, 10); GM_setValue('allRefreshSettings', allRefreshSettings); document.body.removeChild(dialog.parentNode); refreshManageSettingsDialog(parentDialog); } }); }; const deleteSetting = (parentDialog, site) => { delete allRefreshSettings[site]; GM_setValue('allRefreshSettings', allRefreshSettings); refreshManageSettingsDialog(parentDialog); }; startAutoRefresh(); GM_registerMenuCommand("Manage Settings", manageAllSettingsDialog); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址