Persistent Auto-Click "Continue" on UpLearn

Continuously simulates user click on UpLearn's "Continue" button across multiple lessons/pages in SPA environment like React (no full reloads needed). 🧠✨

目前為 2025-04-05 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Persistent Auto-Click "Continue" on UpLearn
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Continuously simulates user click on UpLearn's "Continue" button across multiple lessons/pages in SPA environment like React (no full reloads needed). 🧠✨
// @author       JustSimplyDnaie
// @match        *://*.uplearn.co.uk/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    const BUTTON_SELECTOR = 'button[type="submit"]';
    const OBSERVER_DELAY = 500; // How often to check DOM changes
    let clickedRecently = false;

    function simulateClick(element) {
        console.log('[Auto-Click] Simulating click on "Continue"...');
        const mouseEvent = new MouseEvent('click', {
            bubbles: true,
            cancelable: true,
            view: window,
        });
        element.dispatchEvent(mouseEvent);
        clickedRecently = true;

        setTimeout(() => {
            clickedRecently = false;
        }, 3000); // prevent double-clicking during countdown transitions
    }

    function tryClickContinue() {
        if (clickedRecently) return;

        const buttons = document.querySelectorAll(BUTTON_SELECTOR);
        for (const btn of buttons) {
            if (btn.textContent.trim().toLowerCase() === 'continue') {
                console.log('[Auto-Click] Found "Continue" button. Clicking...');
                simulateClick(btn);
                break;
            }
        }
    }

    // Setup MutationObserver to detect dynamic content changes
    const observer = new MutationObserver(() => {
        tryClickContinue();
    });

    window.addEventListener('load', () => {
        console.log('[Auto-Click] Loaded. Watching for DOM changes...');
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });

        // Initial check in case button already present
        setTimeout(tryClickContinue, 1000);
    });
})();