使用JavaScript实现带权重和总计功能的双按钮点击计数器

使用JavaScript实现带权重和总计功能的双按钮点击计数器

本教程将指导您如何使用javascripthtml数据属性,构建一个包含两个独立点击计数器的页面,并实现一个全局总计功能。其中一个计数器每次点击使总计增加1,另一个计数器则按照设定的权重(例如每9次点击使总计增加1)来更新总计。我们将通过扩展现有的`clickcount`类和html配置来达到这一目标,确保代码模块化、易于维护。

教程背景与目标

在网页开发中,我们经常需要实现用户交互的计数功能。本教程将解决一个具体问题:在一个HTML页面上,存在两个独立的点击计数器,每个计数器都有自己的显示区域和重置按钮。在此基础上,我们需要添加一个全局的总计显示区域,该总计的更新规则如下:

当第一个按钮(例如“Verified Videos”)被点击时,全局总计直接增加1。当第二个按钮(例如“Document Count”)的点击次数达到特定倍数(例如9、18、27等)时,全局总计增加1(即每9次点击增加1)。

为了实现这一目标,我们将对现有的JavaScript ClickCount 类进行扩展,并优化HTML结构以传递必要的配置信息。

HTML结构优化:引入配置参数

为了使每个计数器能够灵活地配置其对全局总计的影响,我们将利用HTML的data-*属性来传递额外信息。具体来说,我们将扩展 data-config-click 属性,增加 weight 和 resultElement 两个字段。

weight: 用于指定该计数器对总计的权重。如果每次点击总计增加1,则 weight 为1。如果每N次点击总计增加1,则 weight 为N。resultElement: 用于指定全局总计显示元素的CSS选择器,以便JavaScript能够找到并更新它。

此外,我们需要一个专门的HTML元素来显示全局总计。

立即学习“Java免费学习笔记(深入)”;

更新后的 HTML (index.html):

    Click counter    

Total Units = 0

关键变化说明:

两个 c-block div 中的 data-config-click 属性都增加了 “weight” 和 “resultElement” 字段。”Document Count” 计数器设置 weight: 9,表示每9次点击总计增加1。”Verified Videos” 计数器设置 weight: 1,表示每次点击总计增加1。resultElement: “#total-units” 指向了页面底部的总计显示元素。页面底部添加了一个 span 元素,id=”total-units”,用于显示全局总计,并初始化为0。

CSS样式(保持不变)

CSS样式主要负责页面的布局和视觉呈现,对于本教程的功能实现没有直接影响,因此可以沿用原有的样式。

style.css (与原代码基本一致):

body {  background: #000000;  height: 100vh;  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;}.block-wrapper {  width: 100vw;  display: flex;  justify-content: center;  margin: auto;}.c-block {  margin: 50px;}button,b {  display: block;  text-align: center;}button {  border: none;  cursor: pointer;}button:focus {  outline: none;}.doctile {  background-color: #000000;  margin-top: 40px;  width: 375px;  height: 425px;  border-radius: 12px;  border: solid;  border-color: rgb(170, 170, 170, 0.5);  display: flex;  justify-content: center;  margin: 20px;}.vidtile {  background-color: #000000;  margin-top: 40px;  width: 375px;  height: 425px;  border-radius: 12px;  border: solid;  border-color: rgb(170, 170, 170, 0.5);  display: flex;  justify-content: center;  margin: 20px;}.button {  margin-top: 40px;  color: rgb(0, 190, 255);  padding: 4px 10px;  border-radius: 6px;  border: solid;  border-color: rgb(170, 170, 170, 0.5);  font-size: 32px;}.button:hover {  opacity: 0.9;}.button[disabled] {  opacity: 0.7;  cursor: not-allowed;}.button-primary {  background-color: rgb(85, 85, 85, .4);}.button-secondary {  background-color: rgb(85, 85, 85, .4);}.button-reset {  background-color: rgb(85, 85, 85, .4);  display: block;  color: rgb(0, 190, 255);  margin: 12px auto 0;  font-size: 16px;  padding: 4px 56px;  border-radius: 6px;  border: solid;  border-width: 2px;  border-color: rgb(170, 170, 170, 0.5);}.result {  color: rgb(0, 190, 255);  font-size: 100px;  margin-bottom: 8px;}.totaltile {  width: 500px;  height: 50px;  padding: 4px 10px;  border-radius: 6px;  border: solid;  border-color: rgb(170, 170, 170, 0.5);  font-size: 32px;  display: flex;  justify-content: center;  margin: auto;}p {  color: rgb(0, 190, 255);  font-size: 25px;  margin-top: 10px;}

JavaScript逻辑实现:扩展ClickCount类

核心的逻辑修改将在 script.js 文件中完成。我们将扩展 ClickCount 类,使其能够处理全局总计的更新,并根据配置的 weight 值计算贡献。

更新后的 JavaScript (script.js):

window.onload = () => {  class ClickCount {    constructor(obj) {      this.triggerNode = obj.triggerNode;      this.targetNode = obj.targetNode;      this.resetNode = obj.resetNode;      this.weight = obj.weight; // 新增:权重      this.resultNode = obj.resultNode; // 新增:全局总计显示节点      this.count = 0;      this.handleClick();      this.handleCount();    }    /**     * 更新全局总计:增加当前计数器的贡献     * 逻辑:计算当前点击前后的加权贡献差值,并更新总计。     * 例如,如果weight=9,count从8到9,则加权贡献从0增加到1。     * 如果count从17到18,则加权贡献从1增加到2。     */    increaseTotal() {      // 获取当前全局总计,如果非数字则默认为0      let currentTotal = isNaN(this.resultNode.innerHTML)        ? 0        : parseInt(this.resultNode.innerHTML);      // 计算当前点击前,该计数器的加权贡献      const previousWeightedCount = parseInt(this.count / this.weight);      // 从总计中减去旧的加权贡献      currentTotal -= previousWeightedCount;      // 计算当前点击后(count + 1),该计数器的加权贡献      const newWeightedCount = parseInt((this.count + 1) / this.weight);      // 将新的加权贡献加回到总计中      currentTotal += newWeightedCount;      // 更新全局总计显示      this.resultNode.innerHTML = currentTotal;    }    /**     * 更新全局总计:减少当前计数器的贡献(用于重置)     * 逻辑:计算当前计数器的加权贡献,并从总计中减去。     */    decreaseTotal() {      // 获取当前全局总计,如果非数字则默认为0      let currentTotal = isNaN(this.resultNode.innerHTML)        ? 0        : parseInt(this.resultNode.innerHTML);      // 计算当前点击数对应的加权贡献      const weightedCount = parseInt(this.count / this.weight);      // 从总计中减去该贡献      currentTotal -= weightedCount;      // 更新全局总计显示      this.resultNode.innerHTML = currentTotal;    }    /**     * 处理点击事件     */    handleClick() {      this.triggerNode.addEventListener("click", () => {        this.increaseTotal(); // 在计数器自身增加前,先更新全局总计        this.handleCount({          count: this.count++, // 增加计数器自身点击数        });      });      this.resetNode.addEventListener("click", () => this.handleReset());    }    /**     * 更新计数器自身的显示     */    handleCount() {      this.targetNode.innerHTML = this.count;    }    /**     * 处理重置事件     */    handleReset() {      this.decreaseTotal(); // 在计数器自身重置前,先从全局总计中移除贡献      this.count = 0; // 重置计数器自身点击数      this.handleCount();    }  }  // 遍历所有配置了点击计数器的HTML块  const clickBlock = document.querySelectorAll("[data-config-click]");  clickBlock.forEach((block) => {    const config = JSON.parse(block.dataset.configClick);    // 解构获取所有配置参数,包括新增的 weight 和 resultElement    const { trigger, target, reset, weight, resultElement } = config.selectors;    // 获取DOM节点    const triggerNode = block.querySelector(trigger);    const targetNode = block.querySelector(target);    const resetNode = block.querySelector(reset);    // 获取全局总计显示节点    const resultNode = document.querySelector(resultElement);    // 确保关键节点存在,然后创建 ClickCount 实例    if (triggerNode && targetNode) {      new ClickCount({        triggerNode,        targetNode,        resetNode,        resultNode, // 传递全局总计节点        weight, // 传递权重      });    }  });};

关键 JavaScript 变化说明:

window.onload 包装: 将所有初始化代码放入 window.onload 事件监听器中,确保DOM完全加载后再执行脚本,避免因元素未加载而导致的错误。ClickCount 构造函数扩展:新增 this.weight 和 this.resultNode 属性,用于存储当前计数器的权重和全局总计的DOM节点。increaseTotal() 方法:这是实现加权总计的核心。它首先获取当前的全局总计。然后,它计算当前点击前(this.count)该计数器对总计的贡献 (parseInt(this.count / this.weight)),并从 currentTotal 中减去。接着,计算点击后(this.count + 1)该计数器对总计的贡献 (parseInt((this.count + 1) / this.weight)),并加回到 currentTotal 中。这种“先减后加”的逻辑确保了即使连续多次调用 increaseTotal,只要 this.count 未改变,总计也不会重复增加。它准确地反映了在 this.count 增加1时,加权总计是否应该增加1。最后,更新 resultNode 的 innerHTML。decreaseTotal() 方法:用于处理计数器重置时,从全局总计中移除其贡献。它计算当前 this.count 对应的加权贡献,并直接从 currentTotal 中减去。handleClick() 方法修改:在 this.count++ 之前调用 this.increaseTotal(),确保在更新自身计数的同时,也更新全局总计。handleReset() 方法修改:在 this.count = 0 之前调用 this.decreaseTotal(),确保在重置自身计数的同时,也从全局总计中移除其贡献。初始化逻辑修改:在 clickBlock.forEach 循环中,从 config.selectors 中解构出 weight 和 resultElement。使用 document.querySelector(resultElement) 获取全局总计的DOM节点 resultNode。在创建 ClickCount 实例时,将 resultNode 和 weight 作为参数传递进去。

运行效果与注意事项

完成上述HTML、CSS和JavaScript的修改后,保存文件并在浏览器中打开 index.html。

点击“Verified Videos”按钮,其自身计数会增加,同时页面底部的“Total Units”也会增加1。点击“Document Count”按钮,其自身计数会增加。每当其计数达到9、18、27等时,“Total Units”会增加1。每个计数器的“Reset”按钮将重置该计数器,并同时从“Total Units”中减去该计数器之前贡献的加权值。

注意事项:

DOM加载顺序: 使用 window.onload 是一个良好的实践,确保在JavaScript尝试访问DOM元素时,这些元素已经存在于文档中。数据属性的解析: JSON.parse() 用于将 data-config-click 属性中的JSON字符串转换为JavaScript对象。请确保JSON格式正确,否则会导致解析错误。全局总计的唯一性: resultElement 应该指向一个唯一的元素(例如通过 id 选择器),以便所有计数器都能更新同一个全局总计。整数除法: parseInt(count / weight) 实现了向下取整的整数除法,这正是计算加权贡献所需的行为。健壮性: 在 increaseTotal 和 decreaseTotal 方法中,通过 isNaN(this.resultNode.innerHTML) ? 0 : parseInt(this.resultNode.innerHTML) 来获取 currentTotal,增加了代码的健壮性,防止因 resultNode 内容非数字而导致的问题。

总结

通过本教程,我们成功地将两个独立的点击计数器与一个具有复杂加权规则的全局总计功能结合起来。我们利用HTML数据属性实现了灵活的配置,并通过扩展JavaScript类使其具备了管理全局总计的能力。这种模块化和可配置的设计模式在构建复杂的交互式网页应用时非常有用。

以上就是使用JavaScript实现带权重和总计功能的双按钮点击计数器的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1599804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用LocalStorage持久化动态HTML表格数据
上一篇 2025年12月23日 14:05:58
解决浏览器自动播放限制:理解与合规实现
下一篇 2025年12月23日 14:06:14

相关推荐

  • 悟空浏览器怎么做推文怎么做视频

    悟空浏览器本身不提供发布推文或制作视频的功能,它仅作为搜索素材和跳转平台的工具,用户需通过它获取热点信息后,自行在今日头条、抖音、小红书等平台创作并发布原创内容以赚取收益,真正实现盈利的核心在于持续的内容产出而非浏览器本身。 “悟空浏览器”本身是一款主打快速搜索、轻量浏览的手机浏览器,它并不直接提供…

    2026年9月1日
    100
  • 浏览器HSTS状态如何确定及如何解决HSTS导致的HTTP跳转失败问题?

    浏览器HSTS状态检测与HTTP跳转失败解决方案 为增强安全性,许多网站启用HTTP Strict Transport Security (HSTS)协议,强制浏览器仅通过HTTPS访问。这通常会自动将HTTP请求重定向到HTTPS,防止数据明文传输。然而,此机制可能导致问题,例如在新标签页中打开H…

    2026年9月1日
    200
  • 指纹浏览器服务商是什么 主流指纹浏览器厂商对比评测

    指纹浏览器服务商通过深度伪装浏览器指纹和ip地址,为用户提供多个独立、防关联的浏览环境,以满足多账号管理、广告验证等需求;其核心技术在于对user-agent、canvas、webgl、字体、时区等数百项参数的精细化模拟与随机化处理,远超常规浏览器的无痕模式;主流厂商差异体现在指纹伪装的深度、性能稳…

    2026年9月1日
    000
  • 如何实现JavaScript元素平滑滚动?

    优雅的JavaScript滚动:告别生硬跳转 在JavaScript中操控元素的scrollLeft属性时,常常会遇到滚动效果过于生硬的问题。本文将介绍如何为scrollLeft的数值变化添加动画效果,打造更流畅、更舒适的滚动体验。 关键在于避免直接修改scrollLeft值造成的突兀感。直接赋值会…

    2026年9月1日
    600
  • 悟空浏览器看短剧怎么会黑屏呢 短剧黑屏故障排查解决方法

    悟空浏览器看短剧黑屏,这可能是个挺让人扫兴的问题。简单来说,这问题可能出在网络、浏览器本身,或者短剧资源上。别急,咱们一步步排查。 解决方案 检查网络连接: 这是最常见的罪魁祸首。确保你的Wi-Fi信号稳定,或者移动数据流量充足。可以尝试打开其他网页或应用,看看是否也有类似问题。如果所有应用都无法联…

    2026年9月1日
    000
  • 悟空浏览器怎么更换浏览器皮肤主题_悟空浏览器皮肤主题更换方法

    1、可通过菜单或设置更换悟空浏览器皮肤主题;2、菜单路径为点击【三横】→左滑→【更换皮肤】→选择并应用;3、设置路径为点击【设置】→【外观/主题】→选择并确认主题,界面即时更新。 如果您希望个性化您的浏览体验,可以通过更改悟空浏览器的皮肤主题来实现界面风格的变换。以下是具体的操作步骤: 本文运行环境…

    2026年9月1日
    000
  • 浏览器HSTS设置导致项目跳转502错误?如何解决?

    浏览器HSTS设置与项目跳转502错误:问题分析与解决方案 HTTP Strict Transport Security (HSTS) 可能会导致网页开发中出现一些问题,例如强制跳转到新标签页时出现502错误。本文分析HSTS设置如何影响浏览器行为,并提供有效的解决方案。 HSTS强制将所有HTTP…

    2026年9月1日
    100
  • 指纹浏览器到底是什么软件 多账号安全管理工具深度剖析

    指纹浏览器并非百分百安全,但它能通过模拟不同设备和浏览器环境、修改指纹信息、隔离cookie、分配独立ip等方式有效降低账号关联风险,广泛应用于跨境电商、社交媒体营销、广告投放、网络爬虫和游戏工作室等场景;选择时需综合考虑指纹真实度、ip质量、操作便捷性、团队协作功能、价格和技术支持等因素,并配合模…

    2026年9月1日
    100
  • 悟空浏览器极速播放用完了怎么办 极速流量续费及替代方案说明

    悟空浏览器“极速播放”流量用完后会降低播放体验或消耗通用流量,解决方法是通过应用内提示、个人中心入口进行续费,选择按天、周、月套餐并用微信、支付宝支付;也可切换Wi-Fi、调低清晰度、启用省流模式、提前下载视频来节省流量;其原理是通过CDN加速和预加载技术优化传输路径,提升播放速度,但依然消耗流量,…

    2026年9月1日
    000
  • java学习应用篇|windows安装JDK及配置环境变量

    java学习应用篇|windows安装JDK及配置环境变量java学习应用篇|windows安装JDK及配置环境变量java学习应用篇|windows安装JDK及配置环境变量java学习应用篇|windows安装JDK及配置环境变量

    学习前言 实际上,本系统中最有价值的内容已经在前两篇文章中介绍完毕,接下来的内容主要是对前面知识的应用。新知识层出不穷,每隔几天就会有新的概念和框架出现。我们在本系列学习中,力求通过基本的学习方法来深入探究代码的本质,这样无论将来出现什么新的知识点,我们都能迅速学习并应用。小刀的水平有限,欢迎大家在…

    2026年9月1日 用户投稿
    100
  • 打印机驱动安装失败怎么办?

    打印机驱动安装失败怎么办?打印机驱动安装失败怎么办?打印机驱动安装失败怎么办?打印机驱动安装失败怎么办?

    在日常生活中,我们难免会遇到各种各样的问题,但无论怎样,我们都应该认真对待并妥善解决这些问题。今天,小编就来给大家分享一下关于打印机安装失败的解决方法,以便大家在遇到类似情况时能够自行解决。 由于电脑系统的配置和设置存在差异,并且打印机种类繁多,这常常会导致打印机驱动安装失败的情况发生。因此,今天我…

    2026年9月1日 用户投稿
    400
  • 如何修复谷歌浏览器崩溃 Chrome浏览器常见问题解决指南

    chrome浏览器频繁崩溃通常由扩展程序冲突、缓存损坏、系统资源不足或浏览器文件损坏引起,可通过禁用扩展、清理缓存、检查资源占用、更新浏览器、扫描恶意软件、重置设置或重新安装来解决;其中扩展程序是最常见原因,可借助隐身模式和逐一启用法排查;清理缓存能消除因数据冲突导致的崩溃,重置设置可恢复默认配置并…

    2026年9月1日
    000
  • 快兔网盘PC客户端如何使用_快兔网盘PC客户端使用教程

    快兔网盘PC端需通过安卓模拟器运行,用户先下载模拟器安装包并完成快速安装,随后在模拟器内启动快兔网盘APP进行登录;接着可使用上传、文件管理、下载解压及分享等功能,所有操作均通过模拟器界面完成;为提升体验,建议开启高帧率模式、设置键盘快捷键,并避免多实例运行以减少卡顿。 快兔网盘PC客户端的使用主要…

    2026年9月1日
    100
  • 百度浏览器视频下载技巧 如何用百度浏览器保存在线视频

    百度浏览器无法直接下载主流视频网站的版权内容,需借助扩展程序或第三方工具实现;用户可安装高评价、高安装量的视频下载扩展,通过解析视频链接获取下载选项,但受限于网站版权保护技术,并非所有视频都能成功下载,最终能否下载取决于目标网站的技术防护措施。 关于如何用百度浏览器下载在线视频,这其实是个老生常谈的…

    2026年9月1日
    000
  • ChatGPT怎么用_ChatGPT注册登录与基础使用教程

    答案是注册并掌握提问技巧后,ChatGPT能成为高效工具。需通过官网注册,验证邮箱和手机号,登录后可在聊天界面输入问题,利用上下文记忆、角色设定、明确指令等技巧提升回答质量,免费版适合初试,Plus版则提供GPT-4、插件、数据分析等高级功能,适合高频深度使用者。 ☞☞☞AI 智能聊天, 问答助手,…

    2026年9月1日
    100
  • 华为花瓣搜索网址导航全攻略_华为搜索引擎的特色功能与优势解析

    华为花瓣搜索的网址是https://www.petalsearch.com,用户可通过网页端或华为设备上的全局搜索、负一屏等入口使用,支持多语言和跨设备同步,具备简洁界面与多端覆盖特点;其核心功能包括聚合式结果展示、应用内搜索、场景化服务直达和隐私保护机制,能实现一次搜索获取网页、视频、应用内内容等…

    2026年9月1日
    000
  • 怎么在VSCode安装Pylint_VSCode配置Python代码检查工具Pylint教程

    答案是安装并配置Pylint扩展与Python包,再在VSCode中启用并自定义规则。首先安装VSCode的Pylint扩展,然后通过pip install pylint在Python环境中安装库;接着在settings.json中设置”python.linting.pylintEnab…

    2026年9月1日
    600
  • 店群专用指纹浏览器是什么 专为店群运营设计的防关联浏览器解析

    店群专用指纹浏览器,说白了,就是一种为多账号运营而生的特殊浏览器。它能让你的每一台电脑,或者说你的每一个浏览器窗口,都像一台全新的、独一无二的设备,从而有效避免电商平台对你多账号操作的“关联”检测,确保你的店群业务能够稳定、安全地运行。 店群运营的本质,就是通过批量开设和管理多个店铺,实现规模化盈利…

    2026年9月1日
    400
  • Safari浏览器打印:如何用JavaScript去除页眉页脚?

    safari浏览器javascript打印:去除页眉页脚的挑战与解决方案 许多开发者致力于用JavaScript精准控制网页打印输出,例如去除默认的页眉页脚,提升打印体验。然而,Safari浏览器对这一需求的实现带来了挑战。本文将深入探讨如何在Safari浏览器中,使用JavaScript或其他方法…

    2026年9月1日
    000
  • 刷悟空浏览器两分钟任务怎么做

    刷悟空浏览器两分钟任务的关键是让应用在后台稳定运行满指定时间,操作时需避免误触返回键、频繁切换应用、开启省电模式或遭遇网络中断;完成任务时可锁屏或轻度使用其他应用,但不能彻底退出悟空浏览器或运行高耗内存程序,若任务要求保持前台则需亮屏等待;建议用旧手机专机专用,减少干扰,按任务具体要求操作即可顺利完…

    2026年9月1日
    300

发表回复

登录后才能评论
关注微信