按钮的addEventlistener无法与多个按钮一起正常工作



我想创建一个脚本,通过事件侦听器drop上传文件。

每次删除文件时,都必须使用保存/编辑按钮创建一个新的表行。这些按钮需要click的事件侦听器,但问题是事件侦听器只处理添加到表中的最后一个按钮。

我对我的问题做了一个简化的例子。函数clickEventSaveButton()包含一个带有匿名函数的.addEventlistener。目前,它只执行控制台日志,但仅针对最后一行表中的按钮。每当创建一个新按钮时,旧按钮就会停止工作。

JS:

'use strict';
const dragArea = document.getElementById('dragArea');
const fileTable = document.getElementById('fileTable');
const fileTableBody = fileTable.querySelector('tbody');
let id = 0;
dragArea.addEventListener('dragover', (e) =>  {
e.preventDefault();
e.stopPropagation();
});
dragArea.addEventListener('drop', (e) => {
e.preventDefault();
e.stopPropagation();
// Add table row
fileTableBody.innerHTML += createFileTableRow(id, 'placeholder');
clickEventSaveButton(id);
id++;
});
function clickEventSaveButton(id) {
let saveButton = document.querySelector('.file-save a[data-id="'+id+'"]');
console.log(saveButton);
console.log(id);
saveButton.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
console.log('Save Button (ID:'+id+') pressed!');
});
}
function createFileTableRow(id, name) {
return `
<tr data-id="${id}">
<td class="file-name">${name}</td>
<td class="file-save">
<a data-id="${id}" class="button is-info is-small">Save</a>
</td>
</tr>
`;
};

HTML:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="script-src 'self';">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Test</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css">
<script defer src="test.js"></script>
</head>
<body>
<div class="columns"><div class="column is-half is-offset-one-quarter">
<h1>Work in progress</h1>
<div id="dragArea" class="box has-background-info-light has-text-centered py-6">
Drag .xlsx files here!
</div>
<hr>
<h3 id="fileTableTitle">No files loaded...</h3>
<table id="fileTable" class="table table is-fullwidth is-hoverable">
<thead><tr><th>File</th><th>Save File</th></tr></thead>
<tbody></tbody>
</table>
<hr>
</div></div>
</body>
</html>

所以,多亏了Patrick Evans,我才解决了困扰我几个小时的问题。

我必须使用insertAdjacentHTML而不是innerHTML

解决方案:

fileTableBody.insertAdjacentHTML('beforeend', createFileTableRow(id, 'placeholder'));

最新更新