修复HTML动态表格中星级评分组件的独立评分问题
动态事件列表星级评分修复方案
问题根源
- 单选框组冲突:所有事件行的星级评分单选框使用了相同的
name="rate",浏览器会将所有同名单选框归为同一组,导致只能选中一个行的评分,修改第二行时会影响第一行。 - ID重复问题:所有星星的
id(如star5、star4)重复,HTML要求id必须唯一,导致label无法正确关联对应行的单选框。
修复步骤
- 给每个新增的事件行分配唯一标识(比如递增计数器),确保每组评分的
name和id唯一。 - 动态生成单选框的
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
相关产品推荐
相关产品推荐

