我做了一个HTML表格,并使用本地JSON数据填充。我已经取得了这样的表,它有一个编辑按钮,我希望它这样,当我点击按钮,它使输入框在各自的行可编辑。
我已经有了一些工作,但我的代码使它这样,当我点击编辑按钮图标的任何一行,它将只使它的顶部行是可编辑的,而不是我点击编辑图标的当前行。这是我的代码。
function buildTable(data) {
var table =document.getElementById("myTable")
for (let i =0; i < data.length; i++) {
let row = `<tr>
<td>${[i+1]}</td>
<td id=customerKey>${data[i].customerKey}</td>
<td id=currency>${data[i].currency}</td>
<td id=currency>${data[i].suffix}</td>
<td><button type="button" onclick="editRow()>
</tr>`
table.innerHTML += row
}
}
editRow()
的函数是
function editRow() {
document.getElementById("customerKey").contentEditable = true;
document.getElementById("currency").contentEditable = true;
document.getElementById("suffix").contentEditable = true;
我不知道为什么它只针对表的顶行,而不是我点击图标的相应行?或者有更好的方法吗?
3条答案
按热度按时间46qrfjad1#
首先,id * 必须 * 是唯一的--你的id在每一行上都是相同的,它会找到第一个。然后,您需要找到所有相关的
<td>
,并使 them contentEditable = true。此外,您没有任何输入框。您有表格单元格,您正在使其内容可编辑。你可以很容易地使用输入并将其初始化为disabled,然后将disabled设置为false。332nm8kg2#
您可以选择为每个表格单元格/元素指定唯一的
id
:3phpmpom3#
其他答案已经解释了为什么你当前的代码不起作用:
ids
必须是唯一的。所以a)当你循环你的数据时,你在每一行添加相同的id,B)当你指向那些行单元格时,浏览器将返回第一个与你的查询选择器匹配的元素,即只返回第一行中的单元格。正如他们所建议的那样,您可以通过在每个单元格的id中添加索引,或者使用classes或。..Data attributes在这里可能非常有用,而不是元素id。您可以添加一个索引来标识行,并在每个单元格上添加一个索引来标识其类型。当你点击一个按钮/编辑一个字段时,你可以使用
closest
找到最近的一行,这反过来又将确定数组中的哪个对象应该被更新/删除等等。例如:当你遍历数据时,你需要向行添加一个
rowid
数据属性:以及
celltype
到每个小区:例如,当您单击一个按钮时,您可以使用
closest
查找最近的行,并对其执行操作。在这里,我们将在单击“删除”按钮时从表中删除一行。问题仍然是如何确保对表的更改反馈到数据集。我不知道你是否已经走到这一步,但我冒昧地写了一个小例子。它与您的代码问题有点偏离,但您可能会发现这里的一些代码很有用。
1.它使用了Redux的基本状态管理原则--一个reducer,它根据传递给它的操作返回一个新的状态,一个store,它返回两个函数
dispatch
和getState
,这两个函数可以用来更新状态,并从中获取数据。1.表格单元格从一开始就是可编辑的,因此无需单击按钮即可进行编辑。唯一的按钮是删除按钮。
1.当单击delete按钮时,处理程序从row元素的data属性中获取
rowid
,向存储区发送一个操作以从数据中删除row对象,然后删除该行。1.当输入字段被更改时,处理程序获取
rowid
、单元格的celltype
数据属性值和输入值,并将该信息分派到存储区,存储区返回一个新状态,其中由rowid
标识的对象用新值更新。