How can I map rating span with input rating value?

Viewed 90

I have dynamic html structure like below example, where in an input field I have rating values.

<input class="rating-value"  value=4>
                                    
<div class="rating">
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
</div>

<input class="rating-value"  value=5>
                                    
<div class="rating">
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
    <span class="fa fa-star"></span>
</div>

I am trying to map it , I have tried below code for map

<script>
    $(document).ready(function(){
        var val = parseInt($(".rating-value").val());
        $(".rating>span:nth-child(-n+"+val+")").addClass("rating-checked");
    });
</script>

For all rating dom has got value 4, How can I map it input field with same rating div ?

1 Answers

Your current code is only looking at the first .rating-value element in the collection. You need to loop through them all, which can be done using each().

From there you need to find the .rating span elements related to the current .rating-value. In this case it can be done using jQuery's DOM traversal methods, next(), find() and the :lt selector. Try this:

jQuery($ => {
  $('.rating-value').each((i, el) => {
    $(el).next('.rating').find(`span:lt(${el.value})`).addClass('rating-checked');
  });
});
.rating-checked { color: #C00; }
<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/5.15.2/css/all.min.css" integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous" />
<input class="rating-value" value="4" />
<div class="rating">
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
</div>

<input class="rating-value" value="5" />
<div class="rating">
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
  <span class="fa fa-star"></span>
</div>

Also note that Font Awesome provides hollow star icons which makes the differentiation easier to understand:

jQuery($ => {
  $('.rating-value').each((i, el) => {
    $(el).next('.rating').find(`span:lt(${el.value})`).toggleClass('far fas');
  });
});
.rating-checked { color: #C00; }
<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/5.15.2/css/all.min.css" integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous" />
<input class="rating-value" value="3" />
<div class="rating">
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
</div>

<input class="rating-value" value="1" />
<div class="rating">
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
  <span class="far fa-star"></span>
</div>

Related