You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何点击HTML中的cookie元素时数值增加2而非1?

解决Cookie点击类网页单次点击+2的异常问题

问题根源

你的代码里重复绑定了Cookie元素的点击事件:

  • HTML中的<div class="cookie">标签通过onclick="cookieClick()"属性直接绑定了点击事件
  • 同时在JavaScript的DOMContentLoaded回调中,又通过addEventListener给同一个元素绑定了一次cookieClick函数

每次点击Cookie时,cookieClick()会被触发两次,而初始upgrade=1,所以num += upgrade执行两次,最终表现为单次点击数值+2。

你尝试修改num或upgrade后数值变0,是因为错误地直接将变量赋值为0,而非修复事件重复绑定的核心问题。

解决方案

只需要保留一种事件绑定方式即可,二选一:

方案1:移除HTML中的onclick属性

修改HTML中的Cookie元素,去掉onclick属性:

<div class="cookie"></div>

方案2:移除JavaScript中的addEventListener绑定

删除JS中DOMContentLoaded回调里的这一行:

document.querySelector(".cookie").addEventListener("click", cookieClick);

两种方案都能确保单次点击只触发一次cookieClick(),此时num会按照预期每次+1(因为初始upgrade=1)。

修正后的完整代码示例

这里以方案1为例,保留JS的事件绑定,修改HTML:

HTML

<div class="counter">Cookies: <span id="cookieCount">0</span></div>
<div class="darkMode" onclick="darker()">Dark Mode Button:</div>
<div id="b1" onclick="b1()">(<span id="inflationCase">20</span> cookies for) Grandmas: <span id="grandma">0</span><span id="noCookies"></span></div>
<div id="b2" onclick="b2()">Auto Clicks: <span id="mouseclick">0</span></div>
<div class="cookie"></div>

JavaScript

let num = 0;
let upgrade = 1;
let noCookiesCheck = 0;
let isThereNoCookies = false;
let mouseupgrade = 0;
let autoClickInterval = 1000; // Interval in milliseconds
let upgradeInflation = 1;

function checker() {
  document.getElementById("cookieCount").innerHTML = num;
  document.getElementById("grandma").innerHTML = upgrade - 1;
  if (isThereNoCookies && noCookiesCheck >= 1) {
    document.getElementById("noCookies").innerHTML = " Not enough Cookies!";
    noCookiesCheck -= 20;
  } else {
    document.getElementById("noCookies").innerHTML = ""; // Clear the message
    isThereNoCookies = false; // Reset the flag
  }
  document.getElementById("inflationCase").innerHTML = Math.floor(20 * upgradeInflation);
}

function cookieClick() {
  num += upgrade;
}

function darker() {
  var body = document.body;
  var cookies = document.getElementsByClassName("cookie");
  for (var i = 0; i < cookies.length; i++) {
    cookies[i].style.backgroundColor = "#390100";
  }
  body.style.backgroundColor = "#3b53ff";
}

function b1() {
  const cost = Math.floor(20 * upgradeInflation);
  if (num >= cost) {
    num -= cost;
    upgrade += 1;
    upgradeInflation += 0.15;
  } else {
    noCookiesCheck = 5000; // Set a longer duration
    isThereNoCookies = true;
  }
}

function b2() {
  const cost = 10; // Fixed cost for auto-click
  if (num >= cost) {
    num -= cost;
    mouseupgrade += 1;
    document.getElementById("mouseclick").innerHTML = mouseupgrade;
  } else {
    noCookiesCheck = 5000; // Set a longer duration
    isThereNoCookies = true;
  }
}

// Auto increment cookies based on mouseupgrade
function autoCookieClick() {
  if (mouseupgrade > 0) {
    num += mouseupgrade;
  }
}

// Call checker() every 100 milliseconds
setInterval(checker, 100);

// Call autoCookieClick() every second
setInterval(autoCookieClick, autoClickInterval);

// Adding event listeners
document.addEventListener("DOMContentLoaded", function() {
  document.querySelector(".darkMode").addEventListener("click", darker);
  document.getElementById("b1").addEventListener("click", b1);
  document.getElementById("b2").addEventListener("click", b2);
  document.querySelector(".cookie").addEventListener("click", cookieClick);
});

CSS

body {
  background-color: rgb(0, 110, 255);
  font-family: "Ubuntu", sans-serif;
}

body,
.cookie {
  transition: background-color 0.5s ease;
}

.counter {
  background-color: rgb(55, 96, 185);
  font-family: "Ubuntu", sans-serif;
  border-radius: 10%;
  height: 100px;
  width: 300px;
  text-align: center;
  position: fixed;
  top: 10px;
  left: 40%;
}

.darkMode {
  background-color: gray;
  border-radius: 20%;
  height: 100px;
  width: 100px;
  text-align: center;
  position: fixed;
  top: 110px;
  left: 10px;
}

.cookie {
  background-color: brown;
  border-radius: 50%;
  height: 500px;
  /* Set a fixed height */
  width: 500px;
  /* Set the same width to make it a circle */
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* Center the element */
}

.buttonConcept,
#b1,
#b2,
#b3 {
  background-color: blue;
  color: aliceblue;
  height: 200px;
  border-radius: 10px;
  width: 300px;
}

#b1 {
  position: fixed;
  top: 10px;
  right: 10px;
}

#b2 {
  position: fixed;
  top: 210px;
  right: 10px;
}

内容的提问来源于stack exchange,提问作者Memelian4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:38:13