-1

I have developed a web page for the star ratings. I need to unselect the stars if the user clicks twice on the same star, how to unselect all the star rating values? that means if the user clicks on 3 stars for the rating and again click on the 3rd star how to disappear all the rating stars value?

This is what I tried

<!DOCTYPE html>
<html>
<head>
    <title>Page Title</title>
    <link rel="manifest" href="manifest.json">
</head>
<body>
    <h1>This is Home page</h1>
    <p>This is a testing page for rating.</p>
    <div>
        <img onClick="rate()" class="star" id="1" src="./img/star.png" />
        <img onClick="rate()" class="star" id="2" src="./img/star.png" />
        <img onClick="rate()" class="star" id="3" src="./img/star.png" />
        <img onClick="rate()" class="star" id="4" src="./img/star.png" />
        <img onClick="rate()" class="star" id="5" src="./img/star.png" />
    </div>
    <div>
        <img onClick="rate1()" class="star" id="6" src="./img/star.png" />
        <img onClick="rate1()" class="star" id="7" src="./img/star.png" />
        <img onClick="rate1()" class="star" id="8" src="./img/star.png" />
        <img onClick="rate1()" class="star" id="9" src="./img/star.png" />
        <img onClick="rate1()" class="star" id="10" src="./img/star.png" />
    </div> 
</body> 
</html>
<script>
    function rate() {
        const { id } = event.target;
        var i;
        for (i = 1; i <= 5; i++) {
            if (i <= parseInt(id)) {
                document.getElementById(i).setAttribute("src", "./img/fillstar.png");
            } else {
                document.getElementById(i).setAttribute("src", "./img/star.png");
            }
        }
    }

    function rate1() {
        const { id } = event.target;
        var i;
        for (i = 6; i <= 10; i++) {
            if (i <= parseInt(id)) {
                document.getElementById(i).setAttribute("src", "./img/fillstar.png");
            } else {
                document.getElementById(i).setAttribute("src", "./img/star.png");
            }
        }
    }
</script>
Sidath
  • 379
  • 1
  • 9
  • 25

2 Answers2

0

You can dynamically add class to every rated star to indicate if it is filled or not (e.g, add class name filled to every rated star). Then, on every click check if the element of event.target contains the class filled. If so, call your functions and in addition, remove all filled classes (unrate). If not, add filled class to every relevant star (rate).

To dynamically toggle (add or remove) a class to an element, you can use element.classList.toggle("className").

Yoni A
  • 124
  • 8
  • Could you please add some code Sample into my code above? I didn't get the idea clearly. – Sidath Jul 08 '21 at 09:42
  • I guess you want something like this: https://star-rating-demo.stackblitz.io. see code link in my original answer – Yoni A Jul 08 '21 at 13:25
0

first get all the elements inside an array so you can have access to them

var stars = Array.from(document.querySelectorAll(".star"));

make a function to uncheck all the stars in your array

function uncheckAllStars(){
    starts.forEach(element => {
        element.classList.setAttribute("src", "./img/star.png");
    })
}

and now add ondblclick to your star elements which trigger when you double click on the element

<img onClick="rate1()" ondblclick="uncheckAllStars()" class="star" id="9" src="./img/star.png" />

now when you double click on a star all of the other stars will be unfilled(their source of image change in this case) this is the idea you can tweak it till it fit your needs

Sarkar
  • 1,225
  • 7
  • 21