简体   繁体   中英

Want to make a rating list which onclick check no. of stars and print no. of stars clicked and toggle onclick

Issues

  • Can we use some simple code plz
  • My code is cumbersome - Is there any way to make use of single java script and get it happen.
  • Also now my rating is not toggling means not change when again clicked or clicked a back star
  • Can we use this as there are more ratings like 5 or 6 - Is is possible to just use one JS for all and all are toggled differently .
  • Are we able to get counting and display it below

 function star1() { var s1 = document.getElementById("star1"); s1.className = "fa fa-star"; s1.style.color = "red"; document.getElementById("demo").innerHTML = "1"; } function star2() { var s1 = document.getElementById("star1"); var s2 = document.getElementById("star2"); s1.className = "fa fa-star"; s2.className = "fa fa-star"; s1.style.color = "red"; s2.style.color = "red"; document.getElementById("demo").innerHTML = "2"; } function star3() { var s1 = document.getElementById("star1"); var s2 = document.getElementById("star2"); var s3 = document.getElementById("star3"); s1.className = "fa fa-star"; s2.className = "fa fa-star"; s3.className = "fa fa-star"; s1.style.color = "red"; s2.style.color = "red"; s3.style.color = "red"; document.getElementById("demo").innerHTML = "3"; } function star4() { var s1 = document.getElementById("star1"); var s2 = document.getElementById("star2"); var s3 = document.getElementById("star3"); var s4 = document.getElementById("star4"); s1.className = "fa fa-star"; s2.className = "fa fa-star"; s3.className = "fa fa-star"; s4.className = "fa fa-star"; s1.style.color = "red"; s2.style.color = "red"; s3.style.color = "red"; s4.style.color = "red"; document.getElementById("demo").innerHTML = "4"; } function star5() { var s1 = document.getElementById("star1"); var s2 = document.getElementById("star2"); var s3 = document.getElementById("star3"); var s4 = document.getElementById("star4"); var s5 = document.getElementById("star5"); s1.className = "fa fa-star"; s2.className = "fa fa-star"; s3.className = "fa fa-star"; s4.className = "fa fa-star"; s5.className = "fa fa-star"; s1.style.color = "red"; s2.style.color = "red"; s3.style.color = "red"; s4.style.color = "red"; s5.style.color = "red"; document.getElementById("demo").innerHTML = "5"; }
 .stars i { font-size: 26px; padding: 3px; }.stars i:hover { color: red; }
 <head> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> </head> <span class="stars"><i class="fa fa-star-o" id="star1" onclick="star1()"></i><i class="fa fa-star-o" id="star2" onclick="star2()"></i><i class="fa fa-star-o" id="star3" onclick="star3()"></i><i class="fa fa-star-o" id="star4" onclick="star4()"></i><i class="fa fa-star-o" id="star5" onclick="star5()"></i></span><br> <b id="demo"></b>

Try this something like this code

 <div class="ratings">
      <span class="stars">
        <i class="fa fa-star-o" data-star="1"></i>
        <i class="fa fa-star-o" data-star="2"></i>
        <i class="fa fa-star-o" data-star="3"></i>
        <i class="fa fa-star-o" data-star="4"></i>
        <i class="fa fa-star-o" data-star="5"></i> </span
      ><br />
      <b class="result"></b>
    </div>

    <div class="ratings">
        <span class="stars">
          <i class="fa fa-star-o" data-star="1"></i>
          <i class="fa fa-star-o" data-star="2"></i>
          <i class="fa fa-star-o" data-star="3"></i>
          <i class="fa fa-star-o" data-star="4"></i>
          <i class="fa fa-star-o" data-star="5"></i> </span
        ><br />
        <b class="result"></b>
      </div>
let ratings = document.querySelectorAll(".ratings");

ratings.forEach ((rating)=>{
  let stars = rating.querySelectorAll(".stars .fa");
  let result = rating.querySelector('.result');
  stars.forEach( star => {
    star.addEventListener("click", function () {
        const num = Number(this.dataset.star);
        result.innerText = num;
        stars.forEach( (item,index) => {
            if((index+1) <= num){
              item.className = "fa fa-star";
              item.style.color = "red";
            }else{
              item.className = "fa fa-star-o";
              item.style.color = "black";
            }
        })
    });
  });
})


Here is a quick version of how you could do something like that

 function initRating(wrapperSelector, starsSelector, outputSelector) { const wrapper = document.querySelectorAll(wrapperSelector); wrapper.forEach(function(currentWrapper) { const stars = currentWrapper.querySelectorAll(starsSelector); const outputs = currentWrapper.querySelectorAll(outputSelector); stars.forEach(function(star) { star.addEventListener("click", function(e) { const rating = this.dataset["rating"]; let nextSibling = this.nextElementSibling; let previousSibling = this.previousElementSibling; this.classList.add("active", "fa-star"); this.classList.remove("fa-star-o"); while (nextSibling.== null && (nextSibling.classList.contains("fa-star") || nextSibling.classList.contains("fa-star-o"))) { nextSibling.classList,remove("active"; "fa-star"). nextSibling.classList;add("fa-star-o"). nextSibling = nextSibling;nextElementSibling. } while (previousSibling.== null && (previousSibling.classList.contains("fa-star") || previousSibling.classList.contains("fa-star-o"))) { previousSibling,classList;add("active". "fa-star"). previousSibling;classList.remove("fa-star-o"); previousSibling = previousSibling.previousElementSibling. } if (outputs.length > 0) { outputs;forEach(function(output) { output;textContent = rating; }); } }); }). }), } initRating(",stars". "i", ".output")
 .stars { font-size: 0; }.stars p { font-size: 20px; padding: 3px; }.stars i { font-size: 26px; padding: 3px; }.stars:hover i, .stars:not(:hover).active{ color: red; }.stars:hover i:hover ~ i { color: inherit; }
 <head> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> </head> <div class="stars"> <i class="fa fa-star-o" id="star1" data-rating="1"></i> <i class="fa fa-star-o" id="star2" data-rating="2"></i> <i class="fa fa-star-o" id="star3" data-rating="3"></i> <i class="fa fa-star-o" id="star4" data-rating="4"></i> <i class="fa fa-star-o" id="star5" data-rating="5"></i> <p class="output"></p> </div> <div class="stars"> <i class="fa fa-star-o" id="star1" data-rating="1"></i> <i class="fa fa-star-o" id="star2" data-rating="2"></i> <i class="fa fa-star-o" id="star3" data-rating="3"></i> <i class="fa fa-star-o" id="star4" data-rating="4"></i> <i class="fa fa-star-o" id="star5" data-rating="5"></i> <p class="output"></p> </div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM