我正在尝试制作一个简单的脚本来使用星级系统处理评级。我在按下星星的那一刻停了下来,因为在单击一个星星后,所有星星都应该保持在原位,而事件侦听器只为这个星星被删除。
你能告诉我我做错了什么吗?我怀疑 removeEventListener 不能正常工作;|
const drawStars = (node, starsNumber = 5, cssRef = "_star") => {
if (starsNumber < 1)
return false;
let star;
// classes to aply when star's filled or not
const starFilled = `fas fa-star ${cssRef}`;
const starContour = `far fa-star ${cssRef}`;
// drawing stars
for (let i = 1; i <= starsNumber; i++) {
star = document.createElement('i');
star.className = `${starContour} ${cssRef}`;
node.appendChild(star);
}
node = [...node.childNodes];
// putting listeners on every star
node.forEach((star, index) => {
// filling stars after hovering
const mouseOverStar = () => {
for (let i = 0; i < starsNumber; i++) {
if (i <= index)
node[i].className = starFilled;
else
node[i].className = starContour;
}
}
// cleaning stars when mouse is out and no star was clicked
const mouseOutStar = () => {
node.forEach(star => star.className = starContour);
}
// trying to remove event listeners from every star but with no effect
const clickOnStar = () => {
node.forEach(star => {
star.removeEventListener('mouseout', mouseOutStar);
star.removeEventListener('mouseover', mouseOverStar);
})
}
// applying listeners
star.addEventListener('mouseover', mouseOverStar);
star.addEventListener('mouseout', mouseOutStar);
star.addEventListener('click', clickOnStar);
});
}
// example of use
const starsContainer = document.querySelector('.stars');
drawStars(starsContainer);
.stars {
margin: 30px;
font-size: 30px;
color: rgb(231, 199, 19);
cursor: pointer;
}
<html>
<head>
<link href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" rel="stylesheet" />
</head>
<body>
<div class="stars"></div>
</body>
</html>