Javascript 按钮的addEventlistener不能与多个按钮一起正常工作

Javascript 按钮的addEventlistener不能与多个按钮一起正常工作,javascript,addeventlistener,Javascript,Addeventlistener,我想创建一个脚本,可以通过事件侦听器drop上传文件 每次删除文件时,都必须使用“保存/编辑”按钮创建一个新的表行。这些按钮需要事件监听器来执行单击,但问题是事件监听器仅对添加到表中的最后一个按钮起作用 我对我的问题做了一个简单的例子。函数clickEventSaveButton()包含一个带有匿名函数的.addEventlistener。目前,它只执行控制台日志,但只执行最后一个表行中的按钮。每次创建新按钮时,旧按钮都会停止工作 JS: 'use strict'; const dragAre

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

每次删除文件时,都必须使用“保存/编辑”按钮创建一个新的表行。这些按钮需要事件监听器来执行
单击
,但问题是事件监听器仅对添加到表中的最后一个按钮起作用

我对我的问题做了一个简单的例子。函数
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>
    `;
};

<!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>

fileTableBody.insertAdjacentHTML('beforeend', createFileTableRow(id, 'placeholder'));
“严格使用”;
const dragArea=document.getElementById('dragArea');
const fileTable=document.getElementById('fileTable');
const fileTableBody=fileTable.querySelector('tbody');
设id=0;
dragArea.addEventListener('dragover',(e)=>{
e、 预防默认值();
e、 停止传播();
});
dragArea.addEventListener('drop',(e)=>{
e、 预防默认值();
e、 停止传播();
//添加表行
fileTableBody.innerHTML+=createFileTableRow(id为“占位符”);
单击事件保存按钮(id);
id++;
});
功能clickEventSaveButton(id){
让saveButton=document.querySelector('.file保存一个[data id=“'+id+'”);
console.log(保存按钮);
console.log(id);
saveButton.addEventListener('单击',(e)=>{
e、 预防默认值();
e、 停止传播();
log('Save按钮(ID:'+ID+')按下!');
});
}
函数createFileTableRow(id,名称){
返回`
${name}
拯救
`;
};
HTML:

'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>
    `;
};

<!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>

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

试验
正在进行的工作
将.xlsx文件拖到这里!

没有加载文件。。。 文件保存文件

多亏了帕特里克·埃文斯,我才解决了困扰我几个小时的问题

我必须使用
insertAdjacentHTML
,而不是
innerHTML

解决方案:

'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>
    `;
};

<!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>

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

fileTableBody.innerHTML+=…
setting/appending
innerHTML
将销毁并重新创建元素的所有内容。这将删除所有以前设置的事件侦听器。使用
insertAdjacentHTML()
insertAdjacentElement()
代替。@PatrickEvans哦,我不知道innerHTML有这么棘手。非常感谢。