如何在eventListener中使用参数?

how to use arguments with eventListener?

提问人:Javier Arambarri Calvo 提问时间:11/9/2023 更新时间:11/11/2023 访问量:61

问:

我需要从“onclick”升级到“eventListener”,但我需要保持参数的传递。使用“eventListener”时如何传递参数?以下是 HTML 和 JavaScript 代码。谢谢。

<tbody>
<?php
$query = mysqli_query($conn, "SELECT id, nombre, signo_solar FROM horoscopos") or die (mysqli_error($conn));
                        
if (mysqli_num_rows($query)==0){
echo "<td colspan='3'>No hay horóscopos que mostrar. Prueba a añadir uno en 'Crear entrada' del menú superior.</td>";
}else{
while ($row = mysqli_fetch_array($query)) { // Mientras haya elementos en el array
    echo "<tr>";
    echo "<td>$row[nombre]</td>";
    echo "<td>$row[signo_solar]</td>";

    echo "<td>
          <button class='btn btn-danger' id='EditButton' onclick='editEntry($row[id])'>Editar</button>
          <button class='btn btn-danger' id='DeleteButton' onclick=\"deleteEntry($row[id],'$row[nombre]','$row[signo_solar]')\">Eliminar</button>
          </td>";
    echo "</tr>";
}
}
?>
</tbody>

JavaScript 中:

function editEntry(id){
    ...
}
function deleteEntry(id, nombre, signo){
    ...
}

document.addEventListener('DOMContentLoaded', (event) => {
    document.getElementById("EditButton").addEventListener("click", editEntry);
    document.getElementById("DeleteButton").addEventListener("click", deleteEntry);
})
JavaScript HTML 事件

评论

0赞 Heretic Monkey 11/9/2023
这回答了你的问题吗?如何将参数传递给addEventListener侦听器函数?

答:

2赞 Rory McCrossan 11/9/2023 #1

使用不显眼的事件处理程序时,不会传递参数。相反,您可以使用属性将元数据存储在元素中,并在事件触发时将其读回。data

此外,请注意,在循环创建重复内容时,切勿使用属性。这将导致无效的重复。在这种情况下,您应该使用通用型。idclass

下面是实施上述准则的工作示例:

const editButtonHandler = e => {
  const row = e.target.closest('tr');
  const rowId = row.dataset.rowid;
  console.log(`Editing rowId: ${rowId}`);
  // your logic here...
}

const deleteButtonHandler = e => {
  const row = e.target.closest('tr');
  const rowId = row.dataset.rowid;
  const rowNumber = row.dataset.rownumber;
  const rowSigno = row.dataset.signo;
  console.log(`Deleting rowId: ${rowId} / number: ${rowNumber} / signo: ${rowSigno}`);
    
  // your logic here... AJAX?
  
  row.remove();
}

document.querySelectorAll('.edit-button').forEach(btn => btn.addEventListener('click', editButtonHandler));
document.querySelectorAll('.delete-button').forEach(btn => btn.addEventListener('click', deleteButtonHandler));
<table>
  <tbody>
    <tr data-rowid="id1" data-rownumber="num1" data-signo="foo">
      <td>1</td>
      <td>signo_solar 1</td>
      <td>
        <button class="btn btn-danger edit-button">Editar</button>
        <button class="btn btn-danger delete-button">Eliminar</button>
      </td>
    </tr>    
    <tr data-rowid="id2" data-rownumber="num2" data-signo="bar">
      <td>1</td>
      <td>signo_solar 2</td>
      <td>
        <button class="btn btn-danger edit-button">Editar</button>
        <button class="btn btn-danger delete-button">Eliminar</button>
      </td>
    </tr>
  </tbody>
</table>

评论

0赞 11/9/2023
但是表没有固定的大小,这取决于数据库有多少个关系。
1赞 Rory McCrossan 11/9/2023
这正是使用此模式的原因。上面的代码适用于任何长度的 a,只要您将每行的 HTML 保持在同一结构中 - 即。包含您需要读取的属性。<table>data
0赞 11/9/2023
eventListener 不起作用
1赞 Rory McCrossan 11/9/2023
正如您在我的答案中的示例中看到的那样,它显然确实如此。您是否在本地版本中正确地重新创建了上述解决方案?检查控制台是否有错误
0赞 Heretic Monkey 11/9/2023
这最好写在副本上......
-1赞 Will Huang 11/9/2023 #2

这是为您提供的参考实现。

<tbody>
<?php
$query = mysqli_query($conn, "SELECT id, nombre, signo_solar FROM horoscopos") or die (mysqli_error($conn));
                        
if (mysqli_num_rows($query)==0){
echo "<td colspan='3'>No hay horóscopos que mostrar. Prueba a añadir uno en 'Crear entrada' del menú superior.</td>";
}else{
while ($row = mysqli_fetch_array($query)) { // Mientras haya elementos en el array
    echo "<tr>";
    echo "<td>$row[nombre]</td>";
    echo "<td>$row[signo_solar]</td>";

    echo "<td>
          <button class='btn btn-danger' id='EditButton' data-id='"+$row['id']+"'>Editar</button>
          <button class='btn btn-danger' id='DeleteButton' data-id='"+$row['id']+"' data-nombre='"+$row['nombre']+"' data-signo='"+$row['signo_solar']+"'>Eliminar</button>
          </td>";
    echo "</tr>";
}
}
?>
</tbody>

JS 将是:

function editEntry(event){
    var id = event.target.getAttribute("data-id");
}
function deleteEntry(event){
    var id = event.target.getAttribute("data-id");
    var nombre = event.target.getAttribute("data-nombre");
    var signo = event.target.getAttribute("data-signo");
}

document.addEventListener('DOMContentLoaded', (event) => {
    document.getElementById("EditButton").addEventListener("click", editEntry);
    document.getElementById("DeleteButton").addEventListener("click", deleteEntry);
})

评论

1赞 11/9/2023
data-id='“+$row[id]+”' sysntax 返回“警告:遇到非数字值”
0赞 Pointy 11/9/2023
不应该吗?$row['id']
0赞 Pointy 11/9/2023
...还有等等?$row['nombre']
0赞 Will Huang 11/10/2023
原始示例代码不完整,与他提出的问题无关。我更新了我的代码。