优化CookieClicker油猴脚本:用EventListener替代setInterval
Let's break down why your v2 script wasn't working and fix it step by step.
Core Issues in Your V2 Script
- Wrong Event Type: The
onchangeevent doesn't fire when child elements are added/removed from containers like#shimmersor#buffs. You need MutationObserver—a tool built specifically for watching DOM changes. - Timer Scope Problem: Your
IntervalBigCookievariable was declared inside thebuffChangefunction, so when you tried to clear it later, the variable didn't exist in that scope. - Game Loading Race Condition: Your script might run before the game's critical elements (
#shimmers,#buffs,#bigCookie) are fully loaded, leading to "element not found" errors. - Inefficient Golden Cookie Handling: The while loop with manual count decrement was unnecessary and could miss elements if the DOM changed mid-loop.
Corrected V2 Script
// ==UserScript== // @name GoldenCookie // @namespace http://tampermonkey.net/ // @version 2.1 // @description Auto golden Cookie Click and massive Big Cookie Click on Buff // @author ProfDrNoiR // @match http://orteil.dashnet.org/cookieclicker/ // @grant none // ==/UserScript== // Wait for the game to fully load before initializing function initScript() { const shimmersContainer = document.getElementById("shimmers"); const buffsContainer = document.getElementById("buffs"); const bigCookie = document.getElementById("bigCookie"); // Global variable to track the big cookie click timer let bigCookieTimer = null; // --- Golden Cookie Observer --- const shimmerObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { // Click every new golden cookie as it appears mutation.addedNodes.forEach(node => { if (node.classList?.contains("shimmer")) { node.click(); console.log("Clicked golden cookie!"); } }); }); }); // --- Buff Observer --- const buffObserver = new MutationObserver(() => { const hasActiveBuffs = buffsContainer.childElementCount > 0; if (hasActiveBuffs && !bigCookieTimer) { // Start spamming clicks when buff activates bigCookieTimer = setInterval(() => { bigCookie.click(); // Uncomment below if you want logs (may slow the game) // console.log("Spamming big cookie click"); }, 5); console.log("Buff activated: Started spamming big cookie"); } else if (!hasActiveBuffs && bigCookieTimer) { // Stop spamming when all buffs expire clearInterval(bigCookieTimer); bigCookieTimer = null; console.log("All buffs expired: Stopped spamming big cookie"); } }); // Start observing container changes shimmerObserver.observe(shimmersContainer, { childList: true }); buffObserver.observe(buffsContainer, { childList: true }); console.log("Cookie Clicker Auto-Script initialized!"); } // Wait for critical game elements to exist before running init const waitForGameLoad = setInterval(() => { if (document.getElementById("shimmers") && document.getElementById("buffs") && document.getElementById("bigCookie")) { clearInterval(waitForGameLoad); initScript(); } }, 100);
Key Improvements Explained
- MutationObserver: This API watches exactly the changes we care about (adding/removing child elements), so we avoid the wasted resources of polling like in v1.
- Global Timer Variable:
bigCookieTimeris declared outside the observer callback, ensuring we can reliably start and stop it across buff state changes. - Game Load Wait: The script waits until all critical elements exist before initializing, eliminating "element not found" errors.
- Efficient Clicking: For golden cookies, we directly click each new node as it's added—no need to count or loop through all elements every time.
- Clean Buff Handling: We only start the timer if it's not already running, and only stop it when no buffs remain, preventing duplicate timers.
Using Your High-Frequency Golden Cookie Save
To load your save:
- Open Cookie Clicker and press
F12to open the browser console. - Paste this command (note: replaced
%21with!in your save string):
Game.LoadSave("Mi4wMTZ8fDE1NDc4NTQyMzQ2MzE7MTU0Njg1NTkzNjkwMjsxNTQ3OTAwMDI0OTQ4O1RyaXBsZSBNdWZmaW47YWF3b2R8MDExMTAwMTExMDEwMTAxMDAxMDB8MzAzMDU3OTQ5Njg3NzIuMzk7NTMyMDIxMDU0Njg2NzUuNjY0OzQyNjI0Ozc0MDsxOTU3NDMxNDg3MDIzMS45MDI7MzE3OzA7MDs2OTg4NDkyMTM3Njk3NDQ4MDAwOzA7MDswOzA7MDszOzUwOzA7MDswOzA7MDswOzswOzA7MTkxOzEzOzE3ODswOzA7NDM7LTE7LTE7LTE7LTE7ODs0OzA7MDswOzA7MDswOzEyOzE1NDc4ODQ5MTc3OTI7MDswOzt8MTYwLDI2MCw2NzM2NDg3MjM0MDU3LDAsLDA7MTQwLDM0MCw1MTU1NjQ4NTgyOCwwLCwxOzEyMCw2MTAsODUyNjM1MDMzNyw0LDE1NDc5MDAzODYwNTE6MjoxNTQ3ODYwNzQzOTIzOjA6MDo0MToxOjA6MTU0Nzg1NDIzNDYzNTogMTExMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMCAwOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MjoxNToyOjM2OjI6MzU6MjozNDowOjA6MDowOjA6MDowOjA6MDowOjA6MTo4OjE6ODowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6MDowOjA6LDA7MTEwLDExMCwyMzc0ODA3MDQ1MiwwLCwxOzkwLDkwLDYwODU0NDE3NTU1LDAsLDE7NzAsNzAsMTkxNzYxMTA0NTAxLDAsLDE7NTAsNTEsNDM3MTQxMzkxNjA4LDEsMi82Ly0xIDIgMTU0Nzg5NzY3NjI4NiAxLDE7NDAsNDAsMTU1NDA5NDYwNTQxNywxLDMyIDIgNjMgMSwwOzIwLDIwLDIyOTAyODUzMjYyOTcsMCwsMTsxMCwxMCw0NTc1Nzc5NDIzMjIwLDAsLDE7Nyw3LDQxNTQwNTE1NDMyODYsMCwsMTswLDAsMCwwLCwwOzAsMCwwLDAsMCwsMDswLDAsMCwwLCwwOzAsMCwwLDAsMCwsMDswLDAsMCwwLCwwOzAsMCwwLDAsMCwwLDAsLDA7fDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMTExMTAwMTAxMDAwMDAwMDAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMTExMTEwMTAxMDExMTExMTExMTExMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMDAxMDEwMDAwMDAwMDAxMDAwMTAxMDEwMDAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMTAxMDEwMDAxMTExMDAxMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMTExMTExMTAwMDAwMTExMTExMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwfDExMTExMTExMTExMTAwMDAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTAxMTAxMDAxMDAxMTEwMTExMTExMTAwMDEwMTAwMTEwMDEwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAxMTEwMDAwMDEwMDAwMDAwMDAxMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDExMTAwMTExMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTEwMTAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMHwwLDIzMTAsMzc5LDc7!!END!!")
- Press Enter, and your save will load.
内容的提问来源于stack exchange,提问作者ProfDrNoiR
相关产品推荐
相关产品推荐

