使用 JavaScript 按 HTML table 中的下拉菜单值过滤
Filtering by drop down menu value in an HTML table using JavaScript
我在 HTML 中创建了一个非常简单的 table。 “部门”列在下拉列表中有 4 个可能的选择。我在第二列中手动输入金额。我要做的是在第三列显示Total Money,应该是:
总金额 =(金额)* 1,如果 Sector = Footbal(因此值为“s1”)
总金额=(金额)*9,其他情况
出于某种原因,它总是乘以 9。我怎样才能让它工作?
function getValue() {
var selectedValue1 = document.querySelectorAll(".sector");
if (selectedValue1 == 's1') {
CONSTANT = 1;
} else {
CONSTANT = 9;
}
}
var Initial = document.querySelectorAll('.number1');
var Double = document.querySelectorAll('.number2');
Initial.forEach(myFunction);
function myFunction(item, index) {
getValue()
item.addEventListener('change', (event) => {
var initialValue = event.target.value;
Double[index].value = initialValue * CONSTANT;
});
}
<! --COMIENZO TABLA -->
<table class="egt">
<! --SEGUNDA LINEA -->
<tr>
<th>Sector</th>
<th>Amount of money</th>
<th>Total money</th>
</tr>
<! --TERCERA LINEA -->
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
<! --CUARTA LINEA -->
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
</table>
<! --FINAL TABLA -->
您应该委托 select 更改并从中获取值
我添加了 thead 和 tbody
const table = document.querySelector(".egt");
table.addEventListener("input", function(e) { // when ANYTHING changes
[...table.querySelectorAll("tbody tr")].forEach(row => { // loop over all rows
const sectorValue = row.querySelector(".sector").value == 's1' ? 1 : 9; // from this row
const num1 = row.querySelector(".number1").value;
row.querySelector(".number2").value = num1 * sectorValue;
});
})
<! --COMIENZO TABLA -->
<table class="egt">
<thead>
<! --SEGUNDA LINEA -->
<tr>
<th>Sector</th>
<th>Amount of money</th>
<th>Total money</th>
</tr>
</thead>
<! --TERCERA LINEA -->
<tbody>
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
<! --CUARTA LINEA -->
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
</tbody>
</table>
<! --FINAL TABLA -->
注意:我使用扩展运算符 [...collection]
将 HTML 集合转换为数组 - 这是为了处理集合上没有原生 forEach 的旧版 EDGE 浏览器。如果您不想支持较旧的 Edge
,则可以 table.querySelectorAll("tbody tr").forEach()
你的cade有一些基本问题(f.e。由于selectedValue1是一个节点列表,它不能等于“s1”),而且你的方法也不正确。
我看不出有任何理由在这里创建循环,但如果需要的话:
遍历每一行,然后得到selection的值和number,计算输出并设置。这是更简单和正确的方法。
首先,给你的 table thead 和 tbody 标签创建一个数据包装器。
let CONSTANT = 1;
let rows = document.querySelectorAll("tbody tr");
[...rows].forEach(row => {
let selection = row.querySelector(".sector").value;
CONSTANT = selection === "s1" ? 1 : 9;
let number = row.querySelector(".number1").value;
row.querySelector(".number2").value = CONSTANT * number;
})
但这也不是最好的方法。不用循环,只需添加事件侦听器并调用一个函数来计算。
let rows = document.querySelectorAll("tbody tr");
[...rows].forEach(row => {
row.querySelector(".number1").addEventListener("input", () => {
calculate(row)
})
row.querySelector(".sector").addEventListener("change", () => {
calculate(row)
});
})
function calculate(row) {
let constant = row.querySelector(".sector").value === "s1" ? 1 : 9;
let num1 = row.querySelector(".number1").value;
row.querySelector(".number2").value = constant * num1;
}
我在 HTML 中创建了一个非常简单的 table。 “部门”列在下拉列表中有 4 个可能的选择。我在第二列中手动输入金额。我要做的是在第三列显示Total Money,应该是:
总金额 =(金额)* 1,如果 Sector = Footbal(因此值为“s1”)
总金额=(金额)*9,其他情况
出于某种原因,它总是乘以 9。我怎样才能让它工作?
function getValue() {
var selectedValue1 = document.querySelectorAll(".sector");
if (selectedValue1 == 's1') {
CONSTANT = 1;
} else {
CONSTANT = 9;
}
}
var Initial = document.querySelectorAll('.number1');
var Double = document.querySelectorAll('.number2');
Initial.forEach(myFunction);
function myFunction(item, index) {
getValue()
item.addEventListener('change', (event) => {
var initialValue = event.target.value;
Double[index].value = initialValue * CONSTANT;
});
}
<! --COMIENZO TABLA -->
<table class="egt">
<! --SEGUNDA LINEA -->
<tr>
<th>Sector</th>
<th>Amount of money</th>
<th>Total money</th>
</tr>
<! --TERCERA LINEA -->
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
<! --CUARTA LINEA -->
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
</table>
<! --FINAL TABLA -->
您应该委托 select 更改并从中获取值
我添加了 thead 和 tbody
const table = document.querySelector(".egt");
table.addEventListener("input", function(e) { // when ANYTHING changes
[...table.querySelectorAll("tbody tr")].forEach(row => { // loop over all rows
const sectorValue = row.querySelector(".sector").value == 's1' ? 1 : 9; // from this row
const num1 = row.querySelector(".number1").value;
row.querySelector(".number2").value = num1 * sectorValue;
});
})
<! --COMIENZO TABLA -->
<table class="egt">
<thead>
<! --SEGUNDA LINEA -->
<tr>
<th>Sector</th>
<th>Amount of money</th>
<th>Total money</th>
</tr>
</thead>
<! --TERCERA LINEA -->
<tbody>
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
<! --CUARTA LINEA -->
<tr>
<td>
<select class="sector">
<option value="s1">Football</option>
<option value="s2">Basketball</option>
<option value="s3">Volleyball</option>
<option value="s4">Rugby</option>
</select>
</td>
<td>
<input type="number" class="number1">
</td>
<td>
<input type="number" class="number2">
</td>
</tr>
</tbody>
</table>
<! --FINAL TABLA -->
注意:我使用扩展运算符 [...collection]
将 HTML 集合转换为数组 - 这是为了处理集合上没有原生 forEach 的旧版 EDGE 浏览器。如果您不想支持较旧的 Edge
table.querySelectorAll("tbody tr").forEach()
你的cade有一些基本问题(f.e。由于selectedValue1是一个节点列表,它不能等于“s1”),而且你的方法也不正确。
我看不出有任何理由在这里创建循环,但如果需要的话:
遍历每一行,然后得到selection的值和number,计算输出并设置。这是更简单和正确的方法。
首先,给你的 table thead 和 tbody 标签创建一个数据包装器。
let CONSTANT = 1;
let rows = document.querySelectorAll("tbody tr");
[...rows].forEach(row => {
let selection = row.querySelector(".sector").value;
CONSTANT = selection === "s1" ? 1 : 9;
let number = row.querySelector(".number1").value;
row.querySelector(".number2").value = CONSTANT * number;
})
但这也不是最好的方法。不用循环,只需添加事件侦听器并调用一个函数来计算。
let rows = document.querySelectorAll("tbody tr");
[...rows].forEach(row => {
row.querySelector(".number1").addEventListener("input", () => {
calculate(row)
})
row.querySelector(".sector").addEventListener("change", () => {
calculate(row)
});
})
function calculate(row) {
let constant = row.querySelector(".sector").value === "s1" ? 1 : 9;
let num1 = row.querySelector(".number1").value;
row.querySelector(".number2").value = constant * num1;
}