Search code examples
javascriptjqueryparseint

JQuery on click Progress Bar


I'm trying to get the progress bar animation to run when I click the .trigger. I'm getting the data-percentage value in the logs but the animation isn't running. It works without using $(this).closest() but I cannot figure out why the animation isn't running with my current JS code.

$(".list").on("click", ".trigger", function() {
  var e = $(this).closest(".item");
  $(".progressbar").attr("data-percentage", e.find("#percent").text());
  var t = e.find("#percent").text();
  return (
    $(".progressbar").each(function() {
      var n = e,
        r = t;
      console.log(t),
        parseInt(n.data("percentage"), 10) < 2 && (r = 2),
        n.children(".bar").animate({
          width: r + "%"
        }, 500);
    }), !1
  );
});
.item {
  width: 50px;
  height: 50px;
  border: 1px solid;
}

.trigger {
  height: 30px;
  width: 30px;
  border: 3px solid blue;
  cursor: pointer;
}

.progressbar {
  position: relative;
  display: block;
  height: 10px;
  background: #f5f5f5;
}

.bar.money-green {
  background: #3cd3ad;
}

.bar {
  position: absolute;
  display: block;
  height: 100%;
  background: #fcb31c;
  width: 0%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list">
  <div class="item">
    <div class="trigger">
      <p id="percent">22</p>
    </div>
  </div>
</div>

<div class="progressbar" data-percentage="">
  <div class="money-green bar"><span></span></div>
</div>


Solution

  • I updated the code for you. Clean and clear way

    You don't need to return in onclick function. And you should use $(this) inside .each to get current index element

    $(".list").on("click", ".trigger", function() {
      var e = $(this).closest(".item");
      var t = e.find("#percent").text();
      $(".progressbar").attr("data-percentage", t);
    
      $(".progressbar").each(function() {
        $(this).find(".bar").animate({
          width: t + "%"
        }, 500);
      });
    });
    

    See the codepen