
在构建交互式 web 表单时,经常会遇到一个场景:某个输入字段的必填状态需要根据用户在同一行中的另一个字段(通常是下拉菜单或复选框)的选择而动态变化。特别是在 html 表格中,由于其结构化特性,定位和操作相邻的元素需要一定的 dom 遍历技巧。
本教程旨在解决以下具体问题:在一个 HTML 表格中,当用户在“审批 (Approval)”列的下拉菜单中选择“拒绝 (Rejected)”或“讨论 (Discuss)”时,如何使同一行中“评论 (Comments)”列的文本输入框变为必填项。
实现这一功能的关键在于以下两点:
首先,我们需要修改生成 HTML 表格的 JavaScript 代码(在原始问题中是 GAS 函数),在每个“审批”下拉菜单中添加 onchange 事件处理器,并传入当前下拉菜单元素本身(this)。
function createTable(dataArray) {
if (dataArray && dataArray.length > 0) {
// 为每个下拉菜单添加 onchange 事件,并传入当前元素
var option = "<select name='D1' onchange='selectValueChanged(this)'>" +
"<option value='empty'></option>" +
"<option value='Approved'>Approved</option>" +
"<option value='Discuss'>Discuss</option>" +
"<option value='Rejected'>Rejected</option>" +
"</select>";
var textBox = "<input type='text' name='comments'/>"
var result = "<div class='card'><table class='table table-borderless table-hover' id='dtable'>" +
"<thead style='white-space: nowrap'>" +
"<tr>" +
"<th class='text-center'>Notes</th>" +
"<th class='text-center'>Approval</th>" +
"<th class='text-center'>Comments</th>" +
"</tr>" +
"</thead>" +
"<tbody>";
for (var i = 0; i < dataArray.length; i++) {
result += "<tr>";
for (var j = 0; j < dataArray[i].length; j++) {
result += "<td class='align-middle' style='word-wrap: break-word;max-width: 160px;text-align:center'>" + dataArray[i][j] + "</td>";
}
result += "<td class='align-middle' style='text-align:center'>" + option + "</td>"; // 包含下拉菜单的单元格
result += "<td class='align-middle' style='text-align:center'>" + textBox + "</td>"; // 包含文本框的单元格
result += "</tr>";
}
result += "</tbody></table></div><br>";
var div = document.getElementById('search-results');
div.innerHTML = result;
} else {
var div = document.getElementById('search-results');
div.innerHTML = "Data not found!";
}
}在上述代码中,我们为 <select> 标签添加了 onchange="selectValueChanged(this)"。this 关键字在这里非常重要,它会将当前被操作的 <select> 元素作为参数传递给 selectValueChanged 函数。
立即学习“前端免费学习笔记(深入)”;
接下来,我们需要实现 selectValueChanged 函数,该函数将接收下拉菜单元素作为参数,并根据其选定值来操作相邻的文本输入框。
function selectValueChanged(cur) {
// cur 参数即为触发事件的 <select> 元素
// 1. 获取 <select> 元素的父元素 <td>
// cur.parentElement
// 2. 获取包含文本输入框的相邻 <td> 元素
// cur.parentElement.nextElementSibling
// 3. 获取相邻 <td> 元素中的第一个子元素,即 <input type='text'>
// cur.parentElement.nextElementSibling.children[0]
const commentsInput = cur.parentElement.nextElementSibling.children[0];
if (cur.value === "Rejected" || cur.value === "Discuss") {
// 如果选择“Rejected”或“Discuss”,则将评论字段设为必填
commentsInput.required = true;
commentsInput.placeholder = "此字段为必填项";
} else {
// 否则,取消必填状态
commentsInput.required = false;
commentsInput.placeholder = "可选";
}
}代码解释:
<!-- 表格生成时 -->
<td class='align-middle' style='text-align:center'><input type='text' name='comments' class='comments-input'/></td>
<!-- JavaScript 中 -->
const commentsInput = cur.closest('tr').querySelector('.comments-input');通过本教程,我们学习了如何在 HTML 表格中实现基于下拉菜单选择的动态必填字段功能。核心在于利用 JavaScript 的事件监听机制和 DOM 遍历能力,精确地定位和修改目标元素。在实际开发中,建议采用更具鲁棒性的 DOM 元素定位方法(如使用 class 或 data- 属性),并结合良好的用户体验设计,以构建更健壮、更友好的 Web 应用程序。
以上就是HTML 表格中基于选择动态设置相邻输入字段为必填项的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号