您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Refreshes the current page with a customizable timer that persists across refreshes
- // ==UserScript==
- // @name Persistent Auto Page Refresher
- // @namespace http://tampermonkey.net/
- // @version 1.0
- // @description Refreshes the current page with a customizable timer that persists across refreshes
- // @author You
- // @match *://*/*
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_deleteValue
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- // Get saved state from previous page load (if any)
- const savedInterval = GM_getValue('refreshInterval', 5);
- const wasRefreshing = GM_getValue('isRefreshing', false);
- const lastRefreshTime = GM_getValue('lastRefreshTime', 0);
- // Default refresh interval
- let refreshInterval = savedInterval * 1000;
- let isRefreshing = wasRefreshing;
- let countdownTimer;
- let refreshTimer;
- // Create control panel
- const panel = document.createElement('div');
- panel.style.position = 'fixed';
- panel.style.bottom = '10px';
- panel.style.right = '10px';
- panel.style.backgroundColor = 'rgba(40,40,40,0.8)';
- panel.style.color = 'white';
- panel.style.padding = '10px';
- panel.style.borderRadius = '8px';
- panel.style.zIndex = '9999';
- panel.style.fontSize = '14px';
- panel.style.boxShadow = '0 0 10px rgba(0,0,0,0.5)';
- panel.style.display = 'flex';
- panel.style.flexDirection = 'column';
- panel.style.gap = '10px';
- // Create input for seconds
- const inputContainer = document.createElement('div');
- inputContainer.style.display = 'flex';
- inputContainer.style.alignItems = 'center';
- inputContainer.style.gap = '8px';
- const inputLabel = document.createElement('label');
- inputLabel.textContent = 'Refresh every:';
- inputLabel.style.marginRight = '5px';
- const input = document.createElement('input');
- input.type = 'number';
- input.min = '1';
- input.value = savedInterval;
- input.style.width = '60px';
- input.style.padding = '5px';
- input.style.borderRadius = '4px';
- input.style.border = '1px solid #ccc';
- const secondsLabel = document.createElement('span');
- secondsLabel.textContent = 'seconds';
- inputContainer.appendChild(inputLabel);
- inputContainer.appendChild(input);
- inputContainer.appendChild(secondsLabel);
- // Create status display
- const status = document.createElement('div');
- status.textContent = isRefreshing ? 'Auto-refresh: On' : 'Auto-refresh: Off';
- status.style.textAlign = 'center';
- status.style.fontWeight = 'bold';
- // Create button container
- const buttonContainer = document.createElement('div');
- buttonContainer.style.display = 'flex';
- buttonContainer.style.gap = '5px';
- // Create toggle button
- const toggleButton = document.createElement('button');
- toggleButton.textContent = isRefreshing ? 'Stop' : 'Start';
- toggleButton.style.padding = '5px 10px';
- toggleButton.style.borderRadius = '4px';
- toggleButton.style.border = 'none';
- toggleButton.style.backgroundColor = isRefreshing ? '#f44336' : '#4CAF50';
- toggleButton.style.color = 'white';
- toggleButton.style.cursor = 'pointer';
- toggleButton.style.flexGrow = '1';
- // Create close button
- const closeButton = document.createElement('button');
- closeButton.textContent = '×';
- closeButton.style.padding = '5px 10px';
- closeButton.style.borderRadius = '4px';
- closeButton.style.border = 'none';
- closeButton.style.backgroundColor = '#f44336';
- closeButton.style.color = 'white';
- closeButton.style.cursor = 'pointer';
- buttonContainer.appendChild(toggleButton);
- buttonContainer.appendChild(closeButton);
- // Add everything to panel
- panel.appendChild(inputContainer);
- panel.appendChild(status);
- panel.appendChild(buttonContainer);
- // Function to start/stop refresh
- function toggleRefresh() {
- if (isRefreshing) {
- // Stop refreshing
- clearInterval(countdownTimer);
- clearTimeout(refreshTimer);
- isRefreshing = false;
- status.textContent = 'Auto-refresh: Off';
- toggleButton.textContent = 'Start';
- toggleButton.style.backgroundColor = '#4CAF50';
- // Save state
- GM_setValue('isRefreshing', false);
- } else {
- // Get user input
- refreshInterval = Math.max(1, parseInt(input.value, 10)) * 1000;
- // Save state
- GM_setValue('refreshInterval', refreshInterval / 1000);
- GM_setValue('isRefreshing', true);
- GM_setValue('lastRefreshTime', Date.now());
- // Start refreshing
- startRefreshTimer();
- isRefreshing = true;
- toggleButton.textContent = 'Stop';
- toggleButton.style.backgroundColor = '#f44336';
- }
- }
- function startRefreshTimer() {
- const now = Date.now();
- let timeLeft = Math.ceil(refreshInterval / 1000);
- if (wasRefreshing && lastRefreshTime) {
- // Calculate time elapsed since the last save
- const elapsedMs = now - lastRefreshTime;
- const remainingMs = refreshInterval - (elapsedMs % refreshInterval);
- timeLeft = Math.ceil(remainingMs / 1000);
- }
- status.textContent = `Refreshing in: ${timeLeft} seconds`;
- // Update the countdown every second
- countdownTimer = setInterval(function() {
- timeLeft -= 1;
- if (timeLeft <= 0) {
- timeLeft = refreshInterval / 1000;
- }
- status.textContent = `Refreshing in: ${timeLeft} seconds`;
- }, 1000);
- // Set the page refresh
- const refreshDelay = wasRefreshing ? (timeLeft * 1000) : refreshInterval;
- refreshTimer = setTimeout(function() {
- GM_setValue('lastRefreshTime', Date.now());
- location.reload();
- }, refreshDelay);
- }
- // Event listeners
- toggleButton.addEventListener('click', toggleRefresh);
- closeButton.addEventListener('click', function() {
- // Stop any refreshing before removing
- if (isRefreshing) {
- clearInterval(countdownTimer);
- clearTimeout(refreshTimer);
- }
- // Clear saved values
- GM_deleteValue('refreshInterval');
- GM_deleteValue('isRefreshing');
- GM_deleteValue('lastRefreshTime');
- panel.remove();
- });
- input.addEventListener('change', function() {
- const newInterval = Math.max(1, parseInt(input.value, 10));
- GM_setValue('refreshInterval', newInterval);
- if (isRefreshing) {
- toggleRefresh(); // Stop current timer
- toggleRefresh(); // Restart with new value
- }
- });
- // Make panel draggable
- let isDragging = false;
- let dragOffsetX, dragOffsetY;
- panel.style.cursor = 'move';
- panel.addEventListener('mousedown', function(e) {
- if (e.target === panel || e.target === status) {
- isDragging = true;
- dragOffsetX = e.clientX - panel.getBoundingClientRect().left;
- dragOffsetY = e.clientY - panel.getBoundingClientRect().top;
- }
- });
- document.addEventListener('mousemove', function(e) {
- if (isDragging) {
- panel.style.left = (e.clientX - dragOffsetX) + 'px';
- panel.style.top = (e.clientY - dragOffsetY) + 'px';
- panel.style.right = 'auto';
- panel.style.bottom = 'auto';
- }
- });
- document.addEventListener('mouseup', function() {
- isDragging = false;
- });
- // Start refreshing if it was active before page reload
- if (isRefreshing) {
- startRefreshTimer();
- }
- // Add to document
- document.body.appendChild(panel);
- })();