提问人:Javier Arambarri Calvo 提问时间:11/9/2023 更新时间:11/11/2023 访问量:61
如何在eventListener中使用参数?
how to use arguments with eventListener?
问:
我需要从“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);
})
答:
2赞
Rory McCrossan
11/9/2023
#1
使用不显眼的事件处理程序时,不会传递参数。相反,您可以使用属性将元数据存储在元素中,并在事件触发时将其读回。data
此外,请注意,在循环创建重复内容时,切勿使用属性。这将导致无效的重复。在这种情况下,您应该使用通用型。id
class
下面是实施上述准则的工作示例:
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
原始示例代码不完整,与他提出的问题无关。我更新了我的代码。
评论