在HTML表格中为动态生成元素实现星级评分功能

本文档旨在解决在动态生成的HTML表格中,为每个元素实现独立的星级评分功能的问题。通过修改JavaScript代码,确保每个事件的评分选项具有唯一的ID和名称,从而避免评分冲突,实现对每个表格行中元素的独立评分。本文将提供修改后的代码和详细的解释,帮助开发者轻松实现这一功能。

问题分析

在动态生成的HTML表格中,如果每个元素的星级评分选项使用相同的id和name属性,会导致评分功能出现问题。具体来说,当用户为一个元素评分时,由于id和name冲突,其他元素的评分也会受到影响,无法实现独立的评分功能。

解决方案

要解决这个问题,需要确保每个元素的星级评分选项具有唯一的id和name属性。这可以通过在动态生成HTML代码时,将事件名称或其他唯一标识符添加到id和name属性中来实现。

代码实现

以下是修改后的JavaScript代码,其中关键部分在于addData函数中动态生成HTML表格行的部分:

$(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(
            '' +
            '' +
            '' + eventname + '' +
            '' + eventdate + '' +
            '' + eventloc + '' +
            '' + eventdesc + '' +
            '' + eventauthor + '' +
            '' +
            ''
            + ''
        );

        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属性被修改为:

这样,每个事件的星级评分选项都具有唯一的id和name,避免了冲突。

完整代码示例

以下是完整的HTML、CSS和JavaScript代码示例:

HTML (index.html):




    
    Eventüberblick
    

    
    
    
    
    
    

    
    


Überblick Event erstellen

Neues Event

Eventliste

All Eventname Eventdatum Eventort Eventbeschreibung Eventautor Like Bewertung

CSS (style.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;
}

JavaScript (script.js):

$(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(
            '' +
            '' +
            '' + eventname + '' +
            '' + eventdate + '' +
            '' + eventloc + '' +
            '' + eventdesc + '' +
            '' + eventauthor + '' +
            '' +
            ''
            + ''
        );

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

注意事项

  • 确保eventname变量的值是唯一的,以便为每个事件生成唯一的id和name。
  • 可以根据实际需求修改id和name的生成方式,例如使用时间戳或其他唯一标识符。
  • 在实际应用中,可能需要将评分数据存储到服务器端,以便持久化存储。

总结

通过为动态生成的HTML表格中的每个元素的星级评分选项生成唯一的id和name属性,可以有效地解决评分冲突问题,实现独立的评分功能。本文提供的代码示例和解释可以帮助开发者轻松实现这一功能,并根据实际需求进行修改和扩展。