0

I have used that code to make a counter

(function ($) {
$.fn.countTo = function (options) {
    options = options || {};

    return $(this).each(function () {
        // set options for current element
        var settings = $.extend({}, $.fn.countTo.defaults, {
            from:            $(this).data('from'),
            to:              $(this).data('to'),
            speed:           $(this).data('speed'),
            refreshInterval: $(this).data('refresh-interval'),
            decimals:        $(this).data('decimals')
        }, options);

        // how many times to update the value, and how much to increment the value on each update
        var loops = Math.ceil(settings.speed / settings.refreshInterval),
            increment = (settings.to - settings.from) / loops;

        // references & variables that will change with each update
        var self = this,
            $self = $(this),
            loopCount = 0,
            value = settings.from,
            data = $self.data('countTo') || {};

        $self.data('countTo', data);

        // if an existing interval can be found, clear it first
        if (data.interval) {
            clearInterval(data.interval);
        }
        data.interval = setInterval(updateTimer, settings.refreshInterval);

        // initialize the element with the starting value
        render(value);

        function updateTimer() {
            value += increment;
            loopCount++;

            render(value);

            if (typeof(settings.onUpdate) == 'function') {
                settings.onUpdate.call(self, value);
            }

            if (loopCount >= loops) {
                // remove the interval
                $self.removeData('countTo');
                clearInterval(data.interval);
                value = settings.to;

                if (typeof(settings.onComplete) == 'function') {
                    settings.onComplete.call(self, value);
                }
            }
        }

        function render(value) {
            var formattedValue = settings.formatter.call(self, value, settings);
            $self.html(formattedValue);
        }
    });
};

$.fn.countTo.defaults = {
    from: 0,               // the number the element should start at
    to: 0,                 // the number the element should end at
    speed: 1000,           // how long it should take to count between the target numbers
    refreshInterval: 100,  // how often the element should be updated
    decimals: 0,           // the number of decimal places to show
    formatter: formatter,  // handler for formatting the value before rendering
    onUpdate: null,        // callback method for every time the element is updated
    onComplete: null       // callback method for when the element finishes updating
};

function formatter(value, settings) {
    return value.toFixed(settings.decimals);
}
}(jQuery));

jQuery(function ($) {
 // custom formatting example
 $('#count-number').data('countToOptions', {
formatter: function (value, options) {
  return value.toFixed(options.decimals).replace(/\B(?=(?:\d{3})+(?!\d))/g, 
',');
 }
 });

 // start all the timers
 $('.timer').each(count);  

   function count(options) {
   var $this = $(this);
   options = $.extend({}, options || {}, $this.data('countToOptions') || 
    {});
    $this.countTo(options);
     }
    });

The problem is, the counter starts to count when the site is opened. But I want to make the counter starts when scrolling to the part at its section. P.S That part has an id and there is a link with href to that id when clicking on it it scroll to that part

<h3>
  <a href="#counts" class="page-scroll">Be Part Of Our Story</a>
</h3>
<div class="col-md-4  col-xs-12" >
    <div class="counts text-center">
      <i class="fa fa-cogs fa-4x" aria-hidden="true"></i>
      <h3 class="">WorkShops</h3>
      <p>
        <h1 class="timer count-title sr-icons" id="count-number"          
         data to="300" data-speed="1500"></h1>
      </p>
    </div>
    </div> 

Can anyone help me to solve this problem?

Y.EzzEldin
  • 801
  • 1
  • 8
  • 11
  • so basically you want to delay starting the timer until a certain element comes into the viewport? https://stackoverflow.com/questions/4837772/jquery-how-can-i-trigger-an-event-when-a-div-comes-into-view – Steve0 Aug 14 '17 at 21:39
  • That is my question, how to delay starting the timer?! – Y.EzzEldin Aug 15 '17 at 09:58
  • just dont create the timer until you want to. If it is by visibility, follow the instructions at the link I provided in my previous comment. – Steve0 Aug 15 '17 at 16:40

0 Answers0