Javascript复制到剪贴板功能只复制第一行

Javascrypt copy to clipboard function copying just first row

我是JavaScript的初学者,不知道如何解决这个问题。我在 MySQL 中基于我的数据库创建了一个 table。现在我想用复制按钮复制它的一个单元格。但是我的函数只复制第一个单元格。我知道我必须给我的文本不同的 ID,但我不知道如何。 这是我的代码:

             <tr>
                <td class="ttd">&nbsp;</td>
                <td class="ttd"><?php echo htmlentities($f['ID']); ?> </td>
                <td class="ttd"><?php echo htmlentities($f['Invoice_number']); ?> </td>
                <td class="ttd"><?php echo htmlentities($f['Invoice_date']); ?> </td>
                <td class="ttd"><?php echo htmlentities($f['Month']); ?> </td>
                <td class="ttd"><?php echo htmlentities($f['Space_name']); ?> </td>
                <td class="ttd"><?php echo htmlentities($f['Company_name']); ?> </td>
                <td class="ttd"><?php echo htmlentities($f['Amount']); ?> </td>
                <div class="tooltip">
                <td class="ttd">
                    <input type="text" style="display:none;" id="Key" value="hhhhhhh.php?token=<?php echo $current_token['token']; ?>">
                    <button onclick="myFunction()" >Copy</button>


                    <script>
                    document.forms[0].addEventListener("submit", function(event){
                            if ( send == 0 ) { event.preventDefault(); }
                            });
    
                    function myFunction() {
                    var hidden = document.getElementById("Key");
                    hidden.style.display = 'block';
                    hidden.select();
                    hidden.setSelectionRange(0, 99999)
                    document.execCommand("copy");
                    alert("Copied the text: " + hidden.value);
                    hidden.style.display = 'none';
                    }
                    </script>
                </td>
                </div>
            </tr>
      

问题是您一遍又一遍地使用相同的 ID。文档中的 ID 必须是单数的。因此,您要么必须为每个输入提供唯一的 ID 和唯一的函数名称,要么更改代码以根据按钮查找它并使其可重用。

您需要引用它旁边的元素。您可以使用兄弟姐妹,也可以查看 td 并找到元素。

使用事件委托,这样您就不会向文档中添加一堆点击处理程序。

const tbody = document.querySelector("#myTable tbody");
tbody.addEventListener("click", function (event) {

  // get clicked button
  const btnCopy = event.target.closest(".copy");
  if (btnCopy) {
    copyThis(btnCopy);
  }

});

function copyThis(button) {
  const hiddenInput1 = button.previousElementSibling;
  console.log(hiddenInput1.value);
  
  const hiddenInput2 = button.closest("td").querySelector('input[type="hidden"]');
  console.log(hiddenInput2.value);
  
}
<table id="myTable">
  <tbody>
    <tr>
      <td>
        <input type="hidden" value="1">
        <button type="button" class="copy">Copy</button>
      </td>
    </tr>
      <td>
        <input type="hidden" value="2">
        <button type="button" class="copy">Copy</button>
      </td>
    </tr>
  </tbody>
</table>

如果你真的想使用内联事件

function copyThis(button) {
  const hiddenInput1 = button.previousElementSibling;
  console.log(hiddenInput1.value);
  
  const hiddenInput2 = button.closest("td").querySelector('input[type="hidden"]');
  console.log(hiddenInput2.value);
  
}
<table id="myTable">
  <tbody>
    <tr>
      <td>
        <input type="hidden" value="1">
        <button type="button" class="copy" onclick="copyThis(this)">Copy</button>
      </td>
    </tr>
      <td>
        <input type="hidden" value="2">
        <button type="button" class="copy" onclick="copyThis(this)">Copy</button>
      </td>
    </tr>
  </tbody>
</table>

首先,您需要从输入文本中删除 ID 属性(“键”),因为文档中不应有重复的 ID。

然后您可以更改您的 js,将输入(“键”)元素的同级元素带到当前单击的按钮。

 function myFunction(el) {
  var hidden = el.previousElementSibling;
  hidden.style.display = 'block';
  hidden.select();
  hidden.setSelectionRange(0, 99999)
  document.execCommand("copy");
  alert("Copied the text: " + hidden.value);
  hidden.style.display = 'none';
}
 <table>
  <tr>
    <td class="ttd">&nbsp;</td>
    <td class="ttd">1</td>
    <td class="ttd">2</td>
    <td class="ttd">3</td>
    <td class="ttd">4</td>
    <td class="ttd">5</td>
    <td class="ttd">6</td>
    <td class="ttd">7</td>
    <td class="ttd">
      <input type="text" style="display:none;" value="12321">
      <button onclick="myFunction(this)" >Copy</button>
    </td>
  </tr>
  <tr>
    <td class="ttd">&nbsp;</td>
    <td class="ttd">1</td>
    <td class="ttd">2</td>
    <td class="ttd">3</td>
    <td class="ttd">4</td>
    <td class="ttd">5</td>
    <td class="ttd">6</td>
    <td class="ttd">7</td>
    <td class="ttd">
      <input type="text" style="display:none;" value="2222">
      <button onclick="myFunction(this)" >Copy</button>
    </td>
  </tr>
</table>