javaScript 星级评价效果

这篇博客介绍了如何使用JavaScript和HTML的hidden input元素来创建一个星级评价系统。在实现过程中遇到了问题,即在清除li的类时,只对最后一组有效,作者对此现象进行了猜测并寻求解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用input hidden实现

以后尽量多谢注释以便理解

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>星级评价</title>
    <style>
        .spj:after{ content: '';display: block;clear: both;height: 0;visibility: hidden;}
        .clearfix{ zoom: 1;}
        .spj ul li,.spj ul{ float:left; padding: 0; margin: 0;}
        .spj ul li{ list-style: none; font-size: 26px; color:#999; padding:0 5px; cursor: pointer;user-select: none; font-weight:bold;}
        .spj ul li.col{ color: #ee0;}
        .spj span{ line-height:  30px; margin-left: 15px;}
    </style>

</head>
<body>
    <input type="hidden" value="3" title="10">
    <input type="hidden" value="">
    <script>
        var input=document.querySelectorAll('input[type="hidden"]');
        input.forEach(function(_input){
            var _inputTitle=_input.getAttribute('title')|| 5;
            var div=document.createElement('div');
            //清除浮动
            div.className='spj clearfix';
            _input.parentNode.insertBefore(div,_input);
            var ul=document.createElement('ul');
            div.appendChild(ul);
            var number= ["零","一","二","三","四","五","六","七","八","九","十"];
            //动态添加五角星
            for (var i =1; i <=_inputTitle; i++){
                var li=document.createElement('li');
                ul.appendChild(li);
                li.innerHTML='★';
                li.title=number[i]+'星好评';
            }
            var span=document.createElement('span');
            div.appendChild(span);
            var LI=ul.querySelectorAll('li');
            //默认有value改变颜色
            for (var j = 0; j <= _input.value; j++) {
                //当前一个都没有被点击时不用循环
                if(_input.value=="")break;
                LI[j].className = 'col';
            }
            span.innerHTML=_input.value?""+number[_input.value]+"星好评":"";
            LI.forEach(function(_li,a){
                _li.onclick=function(){
                    span.innerHTML=_li.title;
                    //当前点击选中的星的下标
                    _input.value=a;
                }
                _li.onmouseover=function(){
                    //清除选中的星的颜色
                    for (var i = 0; i < LI.length; i++) {
                        LI[i].className = '';
                    }
                    //当前移上的星和他前面的都变颜色
                    for (var j= 0; j <= a; j++ ){
                        LI[j].className='col';
                    }
                }
                _li.onmouseout=function(){
                    //清除没有点击选中的
                    for (var i = 0; i < LI.length; i++) {
                        LI[i].className = '';
                    }
                    //鼠标移开后变回选中的星
                    for (var j = 0; j <= _input.value; j++) {
                        //当前一个都没有被点击时不用循环
                        if(_input.value=="")break;
                        LI[j].className = 'col';
                    }
                }
            })
        })
    </script>
</body>

<html>

清除li 的类时原本想写一个方法反复调用的,结果发现只有最后一组有效,其他的都清除不了(猜测可能是foreach里面方法名一样的话,后面的会覆盖了前面的方法),暂时没想到解决办法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值