javascript - 表中的事件监听器
问题描述
我正在尝试创建一个聚合表,其中从属元素将汇总为其父元素。每个元素都包含一个类,该类等于其父元素的 id。我已将事件侦听器添加到表的每个元素中,以便总和会向上爬到树上。代码大致如下:
var x = document.getElementsByName("item.AmountY0");
for (i = 1; i < (x.length - 3); i++) {
x[i].addEventListener("change", function(e) {
if (x[i].tagName == "TD") {
document.getElementById("y0_" + x[i].className).innerHTML =
String(parseInt(document.getElementById("y0_" + x[i].className).innerHTML) + parseInt(x[i].innerHTML));
}
if (x[i].tagName == "INPUT") {
document.getElementById("y0_" + x[i].className).innerHTML =
String(parseInt(document.getElementById("y0_" + x[i].className).innerHTML) + parseInt(x[i].value));
}
}, false);
};
当我在控制台中检查单个表格元素时,直接父元素会更新,但其他祖父母不会更新。但是,当我运行该页面时,什么也没有发生(并且没有报告错误)。
对应的HTML代码如下:
@foreach (var item in Model)
{
string y0_id = "y0_" + item.AlphaCode;
string class_parent = item.ParentCode;
string class_parent_right = item.ParentCode + " " + item.CssClassAmt;
<tr class="@item.CssClassRow">
<td hidden="true">@Html.DisplayFor(modelItem => item.FullSymbol)</td>
<td hidden="true">@Html.DisplayFor(modelItem => item.AlphaCode)</td>
<td hidden="true">@Html.DisplayFor(modelItem => item.ParentCode)</td>
<td>@Html.DisplayFor(modelItem => item.Symbol)</td>
<td class="@item.CssClassCell">@Html.DisplayFor(modelItem => item.PositionName)</td>
@if (item.IsFinal[0].Equals('0')) {
<td id=@y0_id class=@class_parent style="text-align: right; width: 120px;" name="item.AmountY0">@Html.DisplayFor(modelItem => item.AmountY0)</td> }
else
{
<td>@Html.TextBoxFor(modelItem => item.AmountY0, new { @id = y0_id, @class = class_parent, @style = "text-align: right; width: 120px;"})</td>
}
<td>@Html.TextBoxFor(modelItem => item.FinNote, new { @class = item.CssClassNote })</td>
<td><a id="js-modal-prompt" class="uk-button uk-button-default uk-button-small" style="line-height: 19px" href="#">+</a></td>
</tr>
请问有什么提示吗?
解决方案
这个问题似乎与闭包有关。您可以使用以下方法修复它:
var x = document.getElementsByName("item.AmountY0");
for (i = 1; i < (x.length - 3); i++) {
(function() {
var elm = document.getElementById("y0_" + x[i].className);
x[i].addEventListener("change", function(e) {
if (x[i].tagName == "TD") {
elm.innerHTML = String(parseInt(elm.innerHTML) + parseInt(x[i].innerHTML));
}
if (x[i].tagName == "INPUT") {
elm.innerHTML = String(parseInt(elm.innerHTML) + parseInt(x[i].value));
}
}, false);
}());
};
推荐阅读
- angular - 如何使用 Angular 服务中的函数在 Google-Cloud-Firestore 中编辑文档
- python - 新:IndexError:列表索引超出范围
- python-3.x - 简单的python端口扫描器
- python - 根据其他列中满足的条件添加列
- ionic-framework - 离子 4:无法获取 /
- ios - 快速在自定义视图上播放透明视频(H.264,AAC)
- javascript - 从其他文件导入函数
- python - 如何使用带有语音识别和 python 的短语打开一扇门
- python-3.x - 读取 csv 文件中的最后一行或具有最新值的行
- node.js - 比较 Firestore 的相同 DocumentReference