javascript - addEventListener 到多个复选框
问题描述
下面,我有一个简单的表单,其中有 4 个复选框作为座位。我想要做的是,当访问者选择带有 IDA2
和的座位复选框时A4
,我希望在单击名称为 的段落后立即显示这些 ID 及其总值id="demo"
。单击 [立即预订] 按钮时,应将总值分配给名为 的变量$TotalCost
。
我怎样才能做到这一点?这是我的代码:
<!DOCTYPE html>
<html>
<body>
<h2>Please choose a seat to book</h2>
<form action="/action_page.php" method="post">
<input type="checkbox" name="vehicle" id="A1" value="$100">$100<br>
<input type="checkbox" name="vehicle" id="A2" value="$65"> $65<br>
<input type="checkbox" name="vehicle" id="A3" value="$55"> $55<br>
<input type="checkbox" name="vehicle" id="A4" value="$50"> $50<br>
<p id="demo">
Selected Seat(s)
<br>
<br>
Total: USD <input type="submit" value="Reserve Now">
</form>
</p>
<script>
document.getElementById("A1").addEventListener("click", displayCheck);
function displayCheck() {
document.getElementById("demo").innerHTML = ;
}
</script>
</body>
</html>
解决方案
这是在复选框上设置事件侦听器的一种方法。我曾经document.querySelectorAll("input[type='checkbox']");
从 DOM 和一个循环中获取所有的复选框元素,以便为每个复选框添加一个侦听器。selections
对象可以跟踪已检查的项目。单击复选框时,项目值将按键添加到对象中。当复选框关闭时,该项目将从对象中删除。每当一个动作发生时,DOM 都会根据selections
.
这个例子只是一个简单的草图来给你一个想法。您的提交按钮需要另一个事件侦听器来处理将表单数据发送到您的 PHP 脚本。我会把它留作练习。
请注意,您提供的 HTML 无效,因为嵌套已损坏。HTML 验证器有助于解决此类问题。
var selections = {};
var checkboxElems = document.querySelectorAll("input[type='checkbox']");
var totalElem = document.getElementById("seats-total");
var seatsElem = document.getElementById("selected-seats");
for (var i = 0; i < checkboxElems.length; i++) {
checkboxElems[i].addEventListener("click", displayCheck);
}
function displayCheck(e) {
if (e.target.checked) {
selections[e.target.id] = {
name: e.target.name,
value: e.target.value
};
}
else {
delete selections[e.target.id];
}
var result = [];
var total = 0;
for (var key in selections) {
var listItem = "<li>" + selections[key].name + " " +
selections[key].value + "</li>";
result.push(listItem);
total += parseInt(selections[key].value.substring(1));
}
totalElem.innerText = total;
seatsElem.innerHTML = result.join("");
}
<!DOCTYPE html>
<html lang="en">
<head>
<title>...</title>
</head>
<body>
<h2>Please choose a seat to book</h2>
<form action="/action_page.php" method="post">
<input type="checkbox" name="vehicle" id="A1" value="$100">$100<br>
<input type="checkbox" name="vehicle" id="A2" value="$65"> $65<br>
<input type="checkbox" name="vehicle" id="A3" value="$55"> $55<br>
<input type="checkbox" name="vehicle" id="A4" value="$50"> $50<br>
<p>Selected Seat(s)</p>
<!-- container for displaying selected seats -->
<ul id="selected-seats"></ul>
<div>
Total: $<span id="seats-total">0</span> USD
<input type="submit" value="Reserve Now">
</div>
</form>
</body>
</html>
通常,您需要动态生成元素并添加事件侦听器。这是一个玩具示例:
for (let i = 0; i < 1000; i++) {
const checkbox = document.createElement("input");
document.body.appendChild(checkbox);
checkbox.type = "checkbox";
checkbox.style.margin = 0;
checkbox.addEventListener("mouseover", e => {
e.target.checked = !e.target.checked;
});
checkbox.addEventListener("mouseout", e =>
setTimeout(() => {
e.target.checked = !e.target.checked;
}, 1000)
);
}
推荐阅读
- php - 在 foreach 循环中以父数组值作为键创建多向数组
- javascript - amp-script 代码中的 document.getElementById 以不同方式提供元素数据
- python - 如何从两个嵌套列表中制作字典?
- ios - 如何修复“'NSInvalidArgumentException',原因:'-[__NSCFNumber caseInsensitiveCompare:]: unrecognized selector sent to instance”?
- android - Room - 使用外部 SQLite 以及内部数据库
- java - 为什么我得到一个可以由 jdk8、10、11、12 构建的 pom,但只有 jdk9 不行?
- ios - 仅在其父视图内拖动 UIImageView
- javascript - 使用 span 来显示省略号而不是 div
- vue.js - 了解 Vue 组件和路由
- django - 查询字符串、urls.py 和视图中所需的更改