我正在try 使用js和jQuery为我的Django项目制作一个星级评级系统. 当鼠标放在每颗星星上时,我想改变星星的 colored颜色 .

我不想让星星的 colored颜色 停留在悬停状态.

I followed this tutorial on YouTube. In this video it seems to work.
JavaScript method preferred

(function($) {
  "use strict";

  $(document).ready(function() {

    const starone = document.getElementById('star-first')
    const startwo = document.getElementById('star-second')
    const starthird = document.getElementById('star-third')
    const starfourth = document.getElementById('star-fourth')
    const starfifth = document.getElementById('star-fifth')

    const form = document.querySelector('.rate-form')
    const confirmBox = document.getElementById('confirm-score')
    const csrf = document.getElementsByName('csrfmiddlewaretoken')

    const handleStarSelect = (size) => {
      const children = form.children
      for (let i = 0; i < children.length; i++) {
        if (i <= size) {
          children[i].classList.add('checked')
        } else {
          children[i].classList.remove('checked')
        }
      }
    }
    // handleStarSelect(2)

    const handleSelect = (selection) => {
      switch (selection) {
        case 'star-first':
          {
            // starone.classList.add('checked')
            // startwo.classList.remove('checked')
            // starthird.classList.remove('checked')
            // starfourth.classList.remove('checked')
            // starfifth.classList.remove('checked')
            handleStarSelect(1)
            return
          }

        case 'star-second':
          {
            handleStarSelect(2)
            return
          }
        case 'star-third':
          {
            handleStarSelect(3)
            return
          }
        case 'star-fourth':
          {
            handleStarSelect(4)
            return
          }
        case 'star-fifth':
          {
            handleStarSelect(5)
            return
          }

      }

    }

    const arr = [starone, startwo, starthird, starfourth, starfifth]

    arr.forEach(item => item.addEventListener('mouseover', (event) => {
      handleSelect(event.target.id)
    }))

  });
})(jQuery);
.checked {
  color: #f2994a;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A==" crossorigin="anonymous" referrerpolicy="no-referrer"
/>
<div class="user-rating">
  <form action="" method="post" class="rate-form">
    {% csrf_token %}
    <button type="submit" class="fa fa-star fa-lg" id="star-first"></button>
    <button type="submit" class="fa fa-star fa-lg" id="star-second"></button>
    <button type="submit" class="fa fa-star fa-lg" id="star-third"></button>
    <button type="submit" class="fa fa-star fa-lg" id="star-fourth"></button>
    <button type="submit" class="fa fa-star fa-lg" id="star-fifth"></button>
  </form>
  <div id="confirm-score"></div>
</div>

推荐答案

仅使用css即可达到相同的效果.别忘了添加键盘焦点事件.

编辑:再看一遍你的问题,我发现你不想要一个css解决方案.因为一些用户出于安全考虑而禁用了JavaScript,而CSS可以使某些事情变得更简单,所以CSS解决方案通常比JavaScript解决方案更好.我还将为您添加一个普通的JavaScript答案,但我建议只在绝对需要的地方使用JavaScript.

.stars {
  display: inline flex;
  flex-flow: row-reverse;
}

.star {
  background-color: initial;
  border: initial;
}

.star:hover,
.star:focus,
.star:hover~.star,
.star:focus~.star {
  cursor: pointer;
  color: #f2994a;
}

.star:focus {
  outline: 2px solid #f2994a;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A==" crossorigin="anonymous" referrerpolicy="no-referrer"
/>
<div class="user-rating">
  <form action="" method="post" class="rate-form">
    {% csrf_token %}
    <div class="stars">
      <button type="submit" class="star" id="star-fifth"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-fourth"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-third"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-second"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-first"><i class="fa fa-star fa-lg"></i></button>
    </div>
  </form>
  <div id="confirm-score"></div>
</div>

JavaScript解决方案:

document.querySelectorAll('.star').forEach((star) => {
  star.addEventListener('mouseenter', addRating)
  star.addEventListener('focus', addRating)
  star.addEventListener('mouseleave', removeRating)
  star.addEventListener('blur', removeRating)
})

function addRating(event) {
  applyRating(event.target, "add")
}

function removeRating(event) {
  applyRating(event.target, "remove")
}

function applyRating(element, action) {
  document.querySelectorAll(`#${element.id}~.star`).forEach((prevStar) => prevStar.classList[action]('checked'))
  element.classList[action]('checked')
}
.stars {
  display: inline flex;
  flex-flow: row-reverse;
}

.star {
  background-color: initial;
  border: initial;
}

.checked {
  color: #f2994a;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A==" crossorigin="anonymous" referrerpolicy="no-referrer"
/>
<div class="user-rating">
  <form action="" method="post" class="rate-form">
    {% csrf_token %}
    <div class="stars">
      <button type="submit" class="star" id="star-fifth"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-fourth"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-third"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-second"><i class="fa fa-star fa-lg"></i></button>
      <button type="submit" class="star" id="star-first"><i class="fa fa-star fa-lg"></i></button>
    </div>
  </form>
  <div id="confirm-score"></div>
</div>

Javascript相关问答推荐

在Angular中将样式应用于innerHTML

拖放仅通过 Select 上传

类型自定义lazy Promise. all

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

为什么这个JS模块在TypeScript中使用默认属性导入?""

你怎么看啦啦队的回应?

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

更新动态数据中对象或数组中的所有值字符串

如何在不影响隐式类型的情况下将类型分配给对象?

VSCode中出现随机行

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

是否可以将Select()和Sample()与Mongoose结合使用?

我想使用GAS和HTML将从Electron 表格中获得的信息插入到文本字段的初始值中

如果我的列有条件,我如何呈现图标?

表单数据中未定义的数组键

从客户端更新MongoDB数据库

如何在底部重叠多个div?

Reaction:从子组件调用父组件中的函数

TS node 找不到依赖的模块

Oracle APEX-如何调用Java脚本函数