I did it like this (total counter from N to X (X> N)):
var dynamicCounterAddNewValue = 20; var currentDynamicUpdater; function dynamicCounterForValueForControlUpdater(_updaterData) { _updaterData.from += dynamicCounterAddNewValue; if (_updaterData.from > _updaterData.to) { _updaterData.from = _updaterData.to; } _updaterData.c.html(_updaterData.from.toString()); if (_updaterData.from < _updaterData.to) { currentDynamicUpdater = setTimeout( dynamicCounterForValueForControlUpdater, 10, { c: _updaterData.c, from: _updaterData.from, to: _updaterData.to } ); } else { clearTimeout(currentDynamicUpdater); } return; }
EDIT: Updated version (more flexible - for N elements one after another ):
(input element is an array of elements for their dynamic calculation)
var dynamicCounterTimeout = 10; var currentDynamicUpdater; function odcArray(_odca) { this.odca = _odca; return; } function odc(_c, _from, _to) { this.c = _c; // $('#control_id') this.from = _from; // eg N this.to = _to; // eg M => (M >= N) var di = parseInt(_to / 45, 10); if (di < 1) { di = 1; } this.dynamicInc = di; return; } function dynamicCounterForValueForControlUpdater(_odca) { if ( _odca.odca === null || !_odca.odca.length ) { clearTimeout(currentDynamicUpdater); return; } var o = _odca.odca[0]; o.from += o.dynamicInc; if (o.from > o.to) { o.from = o.to; _odca.odca.shift(); // Remove first element } ochtml(o.from.toString()); currentDynamicUpdater = setTimeout( dynamicCounterForValueForControlUpdater, dynamicCounterTimeout, _odca ); return; } function dynamicCounterForValueForControl(_odca) { clearTimeout(currentDynamicUpdater); // SETUP all counters to default for (var i = 0; i < _odca.odca.length; i++) { _odca.odca[i].c.html(_odca.odca[i].from.toString()); } dynamicCounterForValueForControlUpdater( _odca ); return; }
source share