
本教程将指导您如何使用javascript和html数据属性,构建一个包含两个独立点击计数器的页面,并实现一个全局总计功能。其中一个计数器每次点击使总计增加1,另一个计数器则按照设定的权重(例如每9次点击使总计增加1)来更新总计。我们将通过扩展现有的`clickcount`类和html配置来达到这一目标,确保代码模块化、易于维护。
在网页开发中,我们经常需要实现用户交互的计数功能。本教程将解决一个具体问题:在一个HTML页面上,存在两个独立的点击计数器,每个计数器都有自己的显示区域和重置按钮。在此基础上,我们需要添加一个全局的总计显示区域,该总计的更新规则如下:
为了实现这一目标,我们将对现有的JavaScript ClickCount 类进行扩展,并优化HTML结构以传递必要的配置信息。
为了使每个计数器能够灵活地配置其对全局总计的影响,我们将利用HTML的data-*属性来传递额外信息。具体来说,我们将扩展 data-config-click 属性,增加 weight 和 resultElement 两个字段。
此外,我们需要一个专门的HTML元素来显示全局总计。
立即学习“Java免费学习笔记(深入)”;
更新后的 HTML (index.html):
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Click counter</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<div class="block-wrapper">
<!-- Document Count 计数器 -->
<div class="doctile">
<div class="c-block" data-config-click='{"selectors":{"trigger":".button","target": ".result","reset":".button-reset", "weight": 9, "resultElement": "#total-units"}}'>
<b class="result"></b>
<button class="button button-primary" type="button">
Document Count
</button>
<button class="button-reset">
Reset
</button>
</div>
</div>
<!-- Verified Videos 计数器 -->
<div class="vidtile">
<div class="c-block" data-config-click='{"selectors":{"trigger":".button","target": ".result","reset":".button-reset", "weight": 1, "resultElement": "#total-units"}}'>
<b class="result"></b>
<button class="button button-secondary" type="button">
Verified Videos
</button>
<button class="button-reset">
Reset
</button>
</div>
</div>
</div>
<script src="./script.js"></script>
<!-- 全局总计显示区域 -->
<span class="totaltile">
<p>Total Units =
<span id="total-units">
0
</span>
</p>
</span>
</body>
</html>关键变化说明:
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;
}核心的逻辑修改将在 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 变化说明:
完成上述HTML、CSS和JavaScript的修改后,保存文件并在浏览器中打开 index.html。
注意事项:
通过本教程,我们成功地将两个独立的点击计数器与一个具有复杂加权规则的全局总计功能结合起来。我们利用HTML数据属性实现了灵活的配置,并通过扩展JavaScript类使其具备了管理全局总计的能力。这种模块化和可配置的设计模式在构建复杂的交互式网页应用时非常有用。
以上就是使用JavaScript实现带权重和总计功能的双按钮点击计数器的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号