为动态生成的HTML表格实现星级评分功能

29次阅读

为动态生成的 HTML 表格实现星级评分功能

本文档旨在解决在动态生成的 html 表格中实现星级评分功能时遇到的问题。通过用户输入动态生成表格,并为每一行添加星级评分功能。文章将详细介绍如何修改现有的 HTML、cssjavaScript 代码,以确保每个表格行都能独立进行评分,避免评分错乱的问题。主要通过修改 radio 按钮的 id 和 name 属性,使其与对应的 事件 名称关联,从而实现每个事件的独立评分。

在构建动态 Web 应用时,经常需要根据用户输入动态生成html 元素,例如表格。如果需要在这些动态生成的元素中添加交互功能,例如星级评分,就需要特别注意元素的 ID 和 Name 属性,以避免冲突和功能错乱。本教程将以一个动态生成 HTML 表格并为其添加星级评分功能的例子,详细讲解如何解决评分错乱的问题。

问题描述

假设你正在构建一个网站,该网站能够动态地将用户输入的事件存储在一个 HTML 表格中。每个存储的事件都可以通过一个星级评分系统进行评分。你已经使用 HTML、javascript和 CSS 实现了一个星级评分系统,但是当前系统只允许对一个元素进行评分。如果在列表中有两个元素,尝试对第二个元素进行评分时,第一个元素的值会被改变,而第二个元素的值无法改变。

原因分析

出现这个问题的主要原因是,在动态生成的表格中,每个事件的星级评分 radio 按钮都使用了相同的 id 和 name 属性。这导致 浏览器 无法区分用户点击的是哪个事件的评分 radio 按钮,从而导致评分错乱。

立即学习 前端免费学习笔记(深入)”;

具体来说,HTML 代码中,星级评分的 radio 按钮如下所示:

<div class="rate">     <input type="radio" id="star5" name="rate" value="5" /><label for="star5" title="text">5 stars</label>     <input type="radio" id="star4" name="rate" value="4" /><label for="star4" title="text">4 stars</label>     <input type="radio" id="star3" name="rate" value="3" /><label for="star3" title="text">3 stars</label>     <input type="radio" id="star2" name="rate" value="2" /><label for="star2" title="text">2 stars</label>     <input type="radio" id="star1" name="rate" value="1" /><label for="star1" title="text">1 star</label> </div>

可以看到,所有的 radio 按钮都使用了相同的 id(如 star5, star4 等)和 name(rate)。当用户点击其中一个 radio 按钮时,浏览器 会选择所有具有相同 name 属性的 radio 按钮,并将其中的一个设置为选中状态。由于所有事件的 radio 按钮都具有相同的 name,因此点击一个事件的 radio 按钮会影响到所有事件的评分。

为动态生成的 HTML 表格实现星级评分功能

飞书多维表格

表格形态的 AI 工作流搭建工具,支持批量化的 AI 创作与分析任务,接入 DeepSeek R1 满血版

为动态生成的 HTML 表格实现星级评分功能26

查看详情 为动态生成的 HTML 表格实现星级评分功能

解决方案

为了解决这个问题,需要确保每个事件的星级评分 radio 按钮都具有唯一的 id 和 name 属性。一种简单的做法是将事件名称添加到 id 和 name 属性中。

具体来说,在 JavaScript 代码中,修改动态生成表格行的代码,将 id 和 name 属性修改为:

$(".table tbody tr").last().after(     '<tr>' +     '<td><input type="checkbox" id="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><div class="rate"><input type="radio" id="'+eventname+'5" name="'+eventname+'rate" value="5" /><label for="'+eventname+'5" title="text">5 stars</label><input type="radio" id="'+eventname+'4" name="'+eventname+'rate" value="4" /><label for="'+eventname+'4" title="text">4 stars</label><input type="radio" id="'+eventname+'3" name="'+eventname+'rate" value="3" /><label for="'+eventname+'3" title="text">3 stars</label><input type="radio" id="'+eventname+'2" name="'+eventname+'rate" value="2" /><label for="'+eventname+'2" title="text">2 stars</label><input type="radio" id="'+eventname+'1" name="'+eventname+'rate" value="1" /><label for="'+eventname+'1" title="text">1 star</label></div></td>'     + '</tr>');

在这个修改后的代码中,id 属性被修改为 ’”+eventname+”5′, ‘”+eventname+”4’ 等,name 属性被修改为 ’”+eventname+”rate’。这样,每个事件的星级评分 radio 按钮都具有唯一的 id 和 name 属性,从而避免了评分错乱的问题。

完整代码

下面是完整的修改后的代码:

$(document).ready(function () {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 fllen Sie alle Felder aus");             return;         }          if (!isValidDate(eventdate)) {alert("Datum muss folgendem Format entsprechen: dd.mm.yyyy ein");             return;         }          // Validierung und Hinzufgen zur Tabelle          $(".table tbody tr").last().after('<tr>'+'<td><input type="checkbox" id="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><div class="rate"><input type="radio" id="'+eventname+'5" name="'+eventname+'rate" value="5" /><label for="'+eventname+'5" title="text">5 stars</label><input type="radio" id="'+eventname+'4" name="'+eventname+'rate" value="4" /><label for="'+eventname+'4" title="text">4 stars</label><input type="radio" id="'+eventname+'3" name="'+eventname+'rate" value="3" /><label for="'+eventname+'3" title="text">3 stars</label><input type="radio" id="'+eventname+'2" name="'+eventname+'rate" value="2" /><label for="'+eventname+'2" title="text">2 stars</label><input type="radio" id="'+eventname+'1" name="'+eventname+'rate" value="1" /><label for="'+eventname+'1" title="text">1 star</label></div></td>'+'</tr>');          function isValidDate(dateString) {var regex = /^d{2}.d{2}.d{4}$/;             return regex.test(dateString);         }      }      // Eventlistener fr 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');         }     }); });

注意事项

  • 确保事件名称是唯一的,否则仍然可能出现 id 和 name 冲突的问题。
  • 如果事件名称包含特殊字符,需要进行转义,以避免 HTML 解析错误。
  • 在实际应用中,可以使用更复杂的方法来生成唯一的 id 和 name,例如使用 UUID。

总结

在动态生成的 HTML 元素中添加交互功能时,需要特别注意元素的 id 和 name 属性,以避免冲突和功能错乱。本教程以一个动态生成 HTML 表格并为其添加星级评分功能的例子,详细讲解了如何通过修改 id 和 name 属性来解决评分错乱的问题。希望本教程能够帮助你更好地构建动态 Web 应用。

站长
版权声明:本站原创文章,由 站长 2025-10-22发表,共计4723字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources