我有每页显示数百行的表,每行都有用户可以更改的输入.我想只发送更新的数据到后端,这样就不会发送太多的数据.在顶部有一个"保存更改"按钮.

我当前没有使用表单元素(所以不发送整个表格)

我所做的是,我将数据库中的行id作为dataset属性分配给每个<tr>,并监听输入的更改,然后如果一行的一个值发生更改,我会将整个行及其输入添加到一个对象中,该对象保存所有更改的行.然后将该对象发送到后端

let updatedData = {};
let table1Form = document.querySelector('#table_1');
table1Form.addEventListener("change", (event) => {
  let row = event.target.closest('tr');
  let rowId = row.dataset.dbRowId;
  let rowInputs = row.querySelectorAll('input');
  updatedData[rowId] = {};
  rowInputs.forEach((input) => {
    if (input.type === "checkbox") {
      updatedData[rowId][input.name] = input.checked;
    } else {
      updatedData[rowId][input.name] = input.value;
    }
  });
});

document.querySelector("#save-changes").addEventListener("click", () => {
  console.log(updatedData);
});
<button id="save-changes">Save Changes</button>
<table id="table_1">
  <tr data-db-row-id="1">
    <td><input type="text" name="email" value="foo@example.com" /></td>
    <td><input type="text" name="name" value="Foo" /></td>
    <td><input type="checkbox" name="show" checked="checked" /></td>
  </tr>
  <tr data-db-row-id="2">
    <td><input type="text" name="email" value="bar@example.com" /></td>
    <td><input type="text" name="name" value="Bar" /></td>
    <td><input type="checkbox" name="show" /></td>
  </tr>
</table>

但这感觉很麻烦,我需要判断每种类型的输入(在上面的示例中,我必须区分checkboxtext输入,因为它们的计算方式不同).

也许有一种更好的方法来做到这一点(也许也可以使用表单数据?)

推荐答案

我当前没有使用表单元素(所以不发送整个表格)

不知道这是不是更好的方法,但在我的上一个项目中,我使用了类似的东西,以防止提交所有数据. 为了不发送整个表格,它只需要独立运行.然后通过表单属性完成对表单的赋值.

根据您的示例:

<form id="myform" method="POST">
    <input type="submit" value="Save Changes">
</form>
<table id="table_1">
  <tr>
    <td><input type="text" name="data[1][email]" value="foo@example.com" /></td>
    <td><input type="text" name="data[1][name]" value="Foo" /></td>
    <td><input type="checkbox" name="data[1][show]" checked="checked" /></td>
  </tr>
  <tr>
    <td><input type="text" name="data[2][email]" value="bar@example.com" /></td>
    <td><input type="text" name="data[2][name]" value="Bar" /></td>
    <td><input type="checkbox" name="data[2][show]" /></td>
  </tr>
</table>

现在,您只需将表单属性添加到输入标记.

document.querySelector('#table_1').addEventListener("change", (event) => {
  let row = event.target.closest('tr');
  let rowInputs = row.querySelectorAll('input');
  rowInputs.forEach((input) => {
    input.setAttribute('form', 'myform');
  });
});

除了IE之外,所有的浏览器都能理解这一点,所以这应该不是问题. https://caniuse.com/form-attribute

参考文献:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#form

Javascript相关问答推荐

为什么JavaScript双边字符串文字插值不是二次的?

一次仅播放一个音频

从实时数据库(Firebase)上的子类别读取数据

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

在这种情况下,如何 for each 元素添加id?

使用useEffect,axios和useParams进行react测试

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

用于编辑CSS样式的Java脚本

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

JavaScript是否有多个`unfined`?

在FAQ Accodion应用程序中使用React useState时出现问题

Reaction即使在重新呈现后也会在方法内部保留局部值

如果我的列有条件,我如何呈现图标?

如何使用Reaction路由导航测试挂钩?

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

对不同目录中的Angular material 表列进行排序

无法向甜甜圈图表上的ChartJSImage添加可见标签

使用JAVASCRIPT-使用If和Else If多次判断条件-使用JAVASRIPT对象及其属性