Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在动态编辑表的行时获取更新的用户输入值?_Javascript_Jquery_Html_Ruby On Rails_Erb - Fatal编程技术网

Javascript 如何在动态编辑表的行时获取更新的用户输入值?

Javascript 如何在动态编辑表的行时获取更新的用户输入值?,javascript,jquery,html,ruby-on-rails,erb,Javascript,Jquery,Html,Ruby On Rails,Erb,我正在尝试使用Javascript和JQuery动态编辑表中的行 预期功能- 表中每行的末尾都有一个编辑链接。当用户按下此链接时,tr元素的文本将替换为相应的html内容以供输入。同时,编辑链接将转换为保存链接。当用户在编辑后按下这个保存链接时,我想在输入中获取更新的值,创建一个表单并发布它 问题- 遍历表行的DOM不会给出新的用户输入值,而是拾取旧的数据 关于如何提取用户输入的新值的任何提示 请检查代码中的保存功能。这是我的.erb文件的一部分 PS:有没有更简洁的方法来实现这个功能 谢谢 &

我正在尝试使用Javascript和JQuery动态编辑表中的行

预期功能- 表中每行的末尾都有一个编辑链接。当用户按下此链接时,tr元素的文本将替换为相应的html内容以供输入。同时,编辑链接将转换为保存链接。当用户在编辑后按下这个保存链接时,我想在输入中获取更新的值,创建一个表单并发布它

问题- 遍历表行的DOM不会给出新的用户输入值,而是拾取旧的数据

关于如何提取用户输入的新值的任何提示

请检查代码中的保存功能。这是我的.erb文件的一部分

PS:有没有更简洁的方法来实现这个功能

谢谢

<table id = "documents_table">
  <thead>
    <tr>
      <th> document ID </th>
      <th> document Link </th>
      <th> document Status </th>
    </tr>
  </thead>

  <%= @documents.each do |document| %>
  <tbody>
    <tr>
      <td> <%= document[:document_id] %> </td>
      <td> <%= document[:document_link] %> </td>
      <td> <%= document[:document_status] %> </td>
      <td> <%= link_to "Edit", {}, {:class => "editLink"} %> </td>
    </tr>
  </tbody>
  <% end %>

 <script type="text/javascript">

 $(".editLink").click(function(event) {
  event.preventDefault();
  var tableRow = $(this).parent().parent();

  var documentId = tableRow.children("td:nth-child(1)");
  var documentLink = tableRow.children("td:nth-child(2)");
  var documentStatus = tableRow.children("td:nth-child(3)");
  var actionLink = tableRow.children("td:nth-child(4)");

  documentId.html("<input type='text' value='" + documentId.html() + "'/>");
  documentLink.html("<input type='text' value='" + documentLink.html() + "'/>");
  documentStatus.html("<select><option value='On-Hold'> On-Hold </option> <option value='Submitted'> Submitted </option> </select>");
  documentAction.html("<input type='text' value='" + documentAction.html() + "'/>");
  actionLink.html("<a class='saveLink' href='/inspection/save'> Save </a>");

  $('.saveLink').bind("click", Save);
});

function Save(event) {
  event.preventDefault();

  // Problematic code -> picks up previous <tr> data instead of new one

  var updatedTableRow = $(this).parent().parent();
  alert(updatedTableRow.html());
  var documentId = updatedTableRow.children("td:nth-child(1):input");
  var documentLink = updatedTableRow.children("td:nth-child(2):input");
  var documentStatus = updatedTableRow.children("td:nth-child(3)");

  var params = { document_id : documentId.val(),
                document_link : documentLink.html(),
                document_status : documentStatus.html()}
  var path = "/inspection/save"
  postForm(path, params);
};
</script>
我想你需要用event.target来代替它


我建议在TR上使用DOM ID。 将选定要编辑的ID存储在.editLink单击处理程序中,以始终知道哪一行处于编辑状态。在“保存”功能中,您可以轻松获得正确的行,如下所示:

var updatedTableRow = $(obj.trIdUnderEdit);

您是否尝试过在输入上使用类?我通常是这样做的。var value=$this.closesttr.find'input.myValue'。这只是为了学习吗?如果不是的话,我建议研究AngularJs,这将大大简化这类东西。我已经用Angular做了很多这样的动态表格,和vanilla JS相比简直是轻而易举。@kurt我试过你的建议了。未拾取用户输入的新值。这似乎不起作用。谢谢你的建议。当你做AlertUpdateTableRow.html;你确定它显示的是较旧的数据吗?是的,它显示的是较旧的数据。事实上,我正在将此数据发布到另一个视图中,在该视图中会显示较旧的数据。问题不在于访问正确的行。我仍然可以访问正确的行。实际的问题是,在遍历tr元素时,用户输入的新值不会被拾取,而旧值会显示出来。
var updatedTableRow = $(obj.trIdUnderEdit);