【问题标题】:Duplicate all Column Cell Input Values with first Column Cell input value使用第一个列单元格输入值复制所有列单元格输入值
【发布时间】:2019-02-12 16:18:06
【问题描述】:

我有一个 html 表格,它由一个表格包裹,每个单元格中都有一个输入元素。

我想知道是否有一种方法可以获取特定列的第一个单元格的输入值并将该值粘贴到该列的其余单元格中。换句话说,用户将在第一个单元格的输入字段中键入内容,然后单击按钮将该条目复制到该列的其余单元格中。

【问题讨论】:

  • 有可能。
  • 您对哪一部分有困难?构建 HTML?从输入中获取值?设置单元格文本?
  • 创建 Javascript 来获取列的第一个单元格的输入值,然后将其粘贴到同一列的所有其他单元格的输入值。我什至不知道如何从这个开始。
  • 通常建议您先尝试一下并展示您尝试过的内容,因此我的问题是尝试将问题缩小到特定的问题。不知道从哪里开始可能是它自己的问题。
  • 是的,我想我应该有。我已经创建了 onClick 按钮/链接并能够获得价值。只是不知道如何将复制的值粘贴到剩余的列单元格中。所以我认为我没有足够的东西值得发帖。对此感到抱歉。

标签: javascript jquery


【解决方案1】:

假设你有一个每行都有一个按钮的表格,给按钮一个类,以便它可以分配一个事件:

<button type='button' class='copybtn'>copy</button>

不要使用 ID,因为您需要多个按钮;

$(".copybtn").click(function() {

您可以使用var col = $(this).closest("td").index() 获取按钮的(添加1 因为.index() 是从0 开始的,但我们需要从1 开始的:nth-child)。

使用以下方法获取列单元格:

var cells = $("table").find("tr > td:nth-child(" + col + ")");

处理此问题的各种方法 - 例如获取上述所有单元格,然后获取第一个作为输入,最后一个作为按钮,或者从第一行的第 n 个子项获取输入(如在 sn-p 中)

获取值:var val = inp.val()

要复制值,取决于您的 HTML,您可以为每个目标单元格指定一个类:

cells.find("td.dest").text(val);

或者您可以获取所有单元格并排除第一个/最后一个:

tbl.find("tr:not(:first):not(:last) > td:nth-child(" + col + ")").text(val);

总共:

$(".copybtn").click(function() {
  // get 0-based column index
  var col = $(this).closest("td").index() + 1;
  var tbl = $(this).closest("table");
  var val = tbl.find("tr:first td:nth-child(" + col + ")").find("input").val();
  tbl.find("tr:not(:first):not(:last) > td:nth-child(" + col + ")").text(val);
});
input {
  width: 50px;
}

td {
  min-width: 20px;
  border: 1px solid #CCC;
  margin: 0;
  padding: 5px
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id='t'>
  <tbody>
    <tr>
      <td><input type='text' class='inp' /></td>
      <td><input type='text' class='inp' /></td>
      <td><input type='text' class='inp' /></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td><button type='button' class='copybtn'>copy</button></td>
      <td><button type='button' class='copybtn'>copy</button></td>
      <td><button type='button' class='copybtn'>copy</button></td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 我能够找到在 ROW 中获取第一个单元格并粘贴到该 ROW 的其余单元格的示例,如上面的示例。但是我需要并且更难找到答案的是,我需要与列而不是行相同的东西。将列中的第一个单元格复制并粘贴到同一列中其下方的所有单元格中。
  • @James 关键是 tr td:nth-child(col) - 更新答案
  • 谢谢,我正在努力。我会告诉你进展如何。
  • 您应该能够将 $("table tr:first td") 更改为 $("table thead tr th") 或 $("table tr:first > td")` 更改为 $("table tr:first > th") 和 .text(xx).find("input").val(xx)。问题是关于定位列 (td:nth-child(col)) 的任何其他内容都会为您编写代码。 SO 不是要获得最终解决方案,而是要解决特定问题(在这种情况下选择列中的单元格),因为这不是代码编写服务和任何其他小的更改,例如将 td 更改为 @ 987654340@你应该使用这里的答案作为基础。
  • 谢谢,我不介意把精力放在学习方面。我真的很喜欢它。你帮了大忙。我也让它按照我需要的方式工作。再次感谢!
【解决方案2】:

如果我理解正确,你需要这样的东西:

const copy=(id) => {
  var value = document.getElementById("col"+id+"-input").value
  var list = document.getElementsByClassName("col"+id+"-input")
  for (i = 0; i < list.length; i++)
    list[i].value = value
}

document.getElementById("col1-button").addEventListener("click", ()=>copy(1))
document.getElementById("col2-button").addEventListener("click", ()=>copy(2))
document.getElementById("col3-button").addEventListener("click", ()=>copy(3))
<table>
  <tr>
    <td><input id="col1-input" class="col1-input"><button id="col1-button">OK</button><br>
      <td><input class="col1-input"></td>
      <td><input class="col1-input"></td>
      <td><input class="col1-input"></td>
      <td><input class="col1-input"></td>
  </tr>
  <tr>
    <td><input id="col2-input" class="col2-input"><button id="col2-button">OK</button><br>
      <td><input class="col2-input"></td>
      <td><input class="col2-input"></td>
      <td><input class="col2-input"></td>
      <td><input class="col2-input"></td>
  </tr>
  <tr>
    <td><input id="col3-input" class="col3-input"><button id="col3-button">OK</button><br>
      <td><input class="col3-input"></td>
      <td><input class="col3-input"></td>
      <td><input class="col3-input"></td>
      <td><input class="col3-input"></td>
  </tr>
</table>

【讨论】:

  • 查看我上面对第一个答案的回复。不是行而是列。感谢您抽出时间回复。
【解决方案3】:

试试这个... JQuery 解决方案。

祝你好运!

$(function() {
 
  $('button').on('click', function() {
    var inputVal = $(this).prev().val();
    
    // Plus one because arrays start at zero    
    var colIndex =  $(this).parent().parent().children().index($(this).parent()) + 1;
    
    $('table tr td:nth-child('+colIndex+')').not(':first')
      .html(inputVal);
    
  });
  
 
}); 
body { margin: 10px; }
table { max-width: 600px; }
td { min-width: 280px; }
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="">
  <table class="table table-bordered">
    <tr>
      <td><input type="text"><button type="button">Copy</button></td>
      <td><input type="text"><button type="button">Copy</button></td>
      <td><input type="text"><button type="button">Copy</button></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </table>
</form>

【讨论】:

  • 查看我上面对第一个答案的回复。不是行而是列。感谢您抽出时间回复。
  • 编辑回复。享受! =)
  • 显然我会建议使用一个类来命名表格和选择器。只是这样它不会与其他表混淆。向表中添加一个类,如 class="my-calc-table-thing" 将选择器更改为 $('.my-calc-table-thing tr td:nth-child('+colIndex+')').not (':first') .html(inputVal);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多