You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EJS渲染用户表正常,点击删除按钮时username返回null问题

问题:删除按钮无法获取用户名,返回null

我用EJS开发Web应用的CRUD操作界面,数据库中的用户表格渲染正常——用户名、对应角色都显示正确,每行对应一个用户,行数也和数据库里的10个账号匹配。但点击删除按钮时,获取到的username始终是null。

EJS代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="../Styles/Manage.css">
        <link rel="stylesheet" href="../Styles/css/all.css">
        <link rel="icon" href="../Images/Seal.ico">
        <script src="../Scripts/Manage.js"></script>
        <title>Manage</title>
    </head>
    <body>
        <div class="Header-Container">
            <header class="Header">
                <img src="../Images/SchoolLogo.png">
                <div class="Search-Bar">
                        <form role="search" action="/search/" class="search"></form>
                    <div class="Search-Container">
                            <input type="text" class="Search-Field" id="SearchField" placeholder="Search">
                            <button type="submit" class="Search-Button" id="SubmitButton"><i class="fa-solid fa-magnifying-glass"></i></button>
                        </form>
                        <div class="Header-Nav">
                            <nav>
                                <ul>
                                    <li id="new">New</li>
                                    <li id="articles">Articles</li>
                                    <li id="books">Books</li>
                                    <li id="about">About Us</li>
                                </ul>
                            </nav>
                        </div>
                    </div>
                </div>
                    <a href="../Teacher-Pages/Manage.html"  class="BtnAnchor"><button id="Upload" class="UploadBtn"><i class="fa-2x fa-solid fa-upload"></i></button></a>
                    <a href="" class="BtnAnchor"><button class="AccountBtn"><i class=" fa-2x fa-solid fa-user"></i></button></a>
                    <button id="Logout" class="LogoutBtn"><i class="fa-2x fa-solid fa-right-from-bracket"></i></button>
            </header>
        </div>
        <div class="User-Section">
            <div class="Table-Container">
                <h1>Users</h1>
                <table class="User-Table">
                    <tr>
                    <th>Username</th>
                    <th>Role</th>
                    <th>Actions</th>
                    </tr>
        
                    <% users.forEach(user => { %>
                        <tr>
                            <td class="Username-Field"><%= user.username %></td>
                            <td><%= user.role %></td>
                            <td>
                                <button class="DeleteBtn" data-username="<%= user.username %>" id="deleteBtn">A</button>
                            </td>
                        </tr>
                     <% }); %>

                </table>
            </div>
        </div>
        <div class="Side-Panel">

        </div>
    </body>
</html>

前端JS代码

document.addEventListener('DOMContentLoaded', () => {
    const deleteButtons = document.querySelectorAll('.DeleteBtn');

    deleteButtons.forEach((button) => {
        button.addEventListener('click', async (event) => {
            const username = event.target.getAttribute('data-username');
            console.log(username); //returns null
            try {
                const response = await fetch(`/api/delete-user/${username}`, {
                    method: 'DELETE',
                });

                if (response.ok) {
                    event.target.closest('tr').remove();
                } else {
                    console.error('Failed to delete user');
                }
            } catch (error) {
                console.error('Error:', error);
            }
        });
    });
});

原因与解决方案

核心原因

你用了event.target获取属性,但点击按钮时,实际触发事件的可能是按钮内部的文本节点(比如按钮上的"A"),这个文本节点没有data-username属性,所以返回null。另外,每个删除按钮都用了相同的id="deleteBtn",违反了HTML id唯一的规范,虽然不是当前问题的直接原因,但需要修正。

修复方案

方案1:用event.currentTarget替代event.target

currentTarget始终指向绑定事件的元素(也就是按钮本身),不管点击的是按钮内部哪个子元素:

document.addEventListener('DOMContentLoaded', () => {
    const deleteButtons = document.querySelectorAll('.DeleteBtn');

    deleteButtons.forEach((button) => {
        button.addEventListener('click', async (event) => {
            const username = event.currentTarget.getAttribute('data-username');
            console.log(username);
            try {
                const response = await fetch(`/api/delete-user/${username}`, {
                    method: 'DELETE',
                });

                if (response.ok) {
                    event.currentTarget.closest('tr').remove();
                } else {
                    console.error('删除用户失败');
                }
            } catch (error) {
                console.error('错误:', error);
            }
        });
    });
});

方案2:直接从循环的button变量获取属性

既然已经拿到了每个按钮元素,直接从button上取属性更可靠,不用依赖事件对象:

document.addEventListener('DOMContentLoaded', () => {
    const deleteButtons = document.querySelectorAll('.DeleteBtn');

    deleteButtons.forEach((button) => {
        button.addEventListener('click', async () => {
            const username = button.getAttribute('data-username');
            console.log(username);
            try {
                const response = await fetch(`/api/delete-user/${username}`, {
                    method: 'DELETE',
                });

                if (response.ok) {
                    button.closest('tr').remove();
                } else {
                    console.error('删除用户失败');
                }
            } catch (error) {
                console.error('错误:', error);
            }
        });
    });
});

额外优化:移除重复id

修改EJS里的按钮代码,去掉重复的id="deleteBtn":

<button class="DeleteBtn" data-username="<%= user.username %>">A</button>

内容的提问来源于stack exchange,提问作者Frostishyper03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:14:59