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

修复HTML动态表格中星级评分组件的独立评分问题

动态事件列表星级评分修复方案

问题根源

  1. 单选框组冲突:所有事件行的星级评分单选框使用了相同的name="rate",浏览器会将所有同名单选框归为同一组,导致只能选中一个行的评分,修改第二行时会影响第一行。
  2. ID重复问题:所有星星的id(如star5、star4)重复,HTML要求id必须唯一,导致label无法正确关联对应行的单选框。

修复步骤

  1. 给每个新增的事件行分配唯一标识(比如递增计数器),确保每组评分的name和id唯一。
  2. 动态生成单选框的name和id,并同步修改label的for属性,使其关联对应行的单选框。

修改后的完整代码

JavaScript 代码

$(document).ready(function () {
    // 用于生成唯一事件ID的计数器
    let eventCounter = 0;

    function addData() {
        var eventname = $("#eventname").val();
        var eventdate = $("#eventdate").val();
        var eventloc = $("#eventloc").val();
        var eventauthor = $("#eventauthor").val();
        var eventdesc = $("#eventdesc").val();

        if (eventname.trim() === '' || eventdate.trim() === '' || eventloc.trim() === '' || eventauthor.trim() === '' || eventdesc.trim() === '') {
            alert("Bitte füllen Sie alle Felder aus");
            return;
        }

        if (!isValidDate(eventdate)) {
            alert("Datum muss folgendem Format entsprechen: dd.mm.yyyy ein");
            return;
        }

        // 生成当前事件的唯一ID
        eventCounter++;
        const uniqueId = `event-${eventCounter}`;

        // 动态生成带唯一标识的评分组件
        const ratingHtml = `
            <div class="rate">
                <input type="radio" id="star5-${uniqueId}" name="rate-${uniqueId}" value="5" />
                <label for="star5-${uniqueId}" title="text">5 stars</label>
                <input type="radio" id="star4-${uniqueId}" name="rate-${uniqueId}" value="4" />
                <label for="star4-${uniqueId}" title="text">4 stars</label>
                <input type="radio" id="star3-${uniqueId}" name="rate-${uniqueId}" value="3" />
                <label for="star3-${uniqueId}" title="text">3 stars</label>
                <input type="radio" id="star2-${uniqueId}" name="rate-${uniqueId}" value="2" />
                <label for="star2-${uniqueId}" title="text">2 stars</label>
                <input type="radio" id="star1-${uniqueId}" name="rate-${uniqueId}" value="1" />
                <label for="star1-${uniqueId}" title="text">1 star</label>
            </div>
        `;

        // 添加行到表格
        $("table tbody tr").last().after(
            `<tr>` +
            `<td><input type="checkbox" class="select-row"></td>` +
            `<td>${eventname}</td>` +
            `<td>${eventdate}</td>` +
            `<td>${eventloc}</td>` +
            `<td>${eventdesc}</td>` +
            `<td>${eventauthor}</td>` +
            `<td><button class="btn btn-link like-button">Gefällt mir</button></td>` +
            `<td>${ratingHtml}</td>` +
            `</tr>`
        );

        function isValidDate(dateString) {
            var regex = /^\d{2}\.\d{2}\.\d{4}$/;
            return regex.test(dateString);
        }
    }

    // Eventlistener für den Button
    $('#addData').click(addData);

    $('.table').on('click', '.like-button', function () {
        $(this).toggleClass('liked');
        if ($(this).hasClass('liked')) {
            $(this).text('Gefällt mir nichtmehr');
            $(this).closest('tr').addClass('liked-event');
        } else {
            $(this).text('Gefällt mir');
            $(this).closest('tr').removeClass('liked-event');
        }
    });
});

CSS 代码(无需修改)

*{
    margin: 0;
    padding: 0;
}
.rate {
    float: left;
    height: 46px;
    padding: 0 10px;
}
.rate:not(:checked) > input {
    position:absolute;
    top:-9999px;
}
.rate:not(:checked) > label {
    float:right;
    width:1em;
    overflow:hidden;
    white-space:nowrap;
    cursor:pointer;
    font-size:30px;
    color:#ccc;
}
.rate:not(:checked) > label:before {
    content: '★ ';
}
.rate > input:checked ~ label {
    color: #ffc700;    
}
.rate:not(:checked) > label:hover,
.rate:not(:checked) > label:hover ~ label {
    color: #deb217;  
}
.rate > input:checked + label:hover,
.rate > input:checked + label:hover ~ label,
.rate > input:checked ~ label:hover,
.rate > input:checked ~ label:hover ~ label,
.rate > label:hover ~ input:checked ~ label {
    color: #c59b08;
}

HTML 代码(无需修改)

<!DOCTYPE html>

<head>
    <meta charset="utf-8" />
    <title>Eventüberblick</title>
    <link href="style.css" rel="stylesheet" type="text/css">

    <!-- Bootstrap 4 CDN -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <script src="Script1.js"></script>

    <!-- Fontawesome CDN Link -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" />
</head>

<header>
    <a href="index.html">Überblick</a>
    <a href="CreateEvent.html">Event erstellen</a>
</header>

<body>
    <h1 class="headline" style="text-align: center;">Neues Event</h1>


    <div class="container">

        <div class="form-div">
            <div class="row">
                <div class="col-md-3">
                    <input type = "text" class="form-control" id="eventname" placeholder="Eventname">
                </div>
                <div class="col-md-3">
                    <input type = "datetime" class="form-control" id="eventdate" placeholder="Eventdatum">
                </div>
                <div class="col-md-3">
                    <input type = "text" class="form-control" id="eventloc" placeholder="Eventort">
                </div>
                <div class="col-md-3">
                    <input type = "text" class="form-control" id="eventauthor" placeholder="Eventautor">
                </div>
                <div class="col-md-3">
                    <input type = "text" class="form-control" id="eventdesc" placeholder="Eventbeschreibung">
                </div>
                <div class="col-md-3" style="text-align: right;">
                    <button class="btn btn-primary" id="addData">Hinzufügen</button>
                </div>
            </div>
        </div>

        <h2 class="headline" style="text-align: center;">Eventliste</h2>
        <div class="container">
            <table class="table">
                <thead>
                    <tr>
                        <th>All<input type="checkbox" id="select-all"></th>
                        <th>Eventname</th>
                        <th>Eventdatum</th>
                        <th>Eventort</th>
                        <th>Eventbeschreibung</th>
                        <th>Eventautor</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                    
                    </tr>
                </tbody>
            </table>
        </div>
    </div>

   <script></script> 

</body>

额外优化说明

  • 把原来的id="select-row"改成了class="select-row",避免ID重复问题
  • 使用模板字符串拼接HTML,代码可读性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:54:56