visibility.core.js
3 years ago
visibility.fallback.js
3 years ago
visibility.js
3 years ago
visibility.timers.js
3 years ago
visibility.timers.js
162 lines
| 1 | ;(function (window) { |
| 2 | var lastTimer = -1; |
| 3 | |
| 4 | var install = function (Visibility) { |
| 5 | |
| 6 | // Run callback every `interval` milliseconds if page is visible and |
| 7 | // every `hiddenInterval` milliseconds if page is hidden. |
| 8 | // |
| 9 | // Visibility.every(60 * 1000, 5 * 60 * 1000, function () { |
| 10 | // checkNewMails(); |
| 11 | // }); |
| 12 | // |
| 13 | // You can skip `hiddenInterval` and callback will be called only if |
| 14 | // page is visible. |
| 15 | // |
| 16 | // Visibility.every(1000, function () { |
| 17 | // updateCountdown(); |
| 18 | // }); |
| 19 | // |
| 20 | // It is analog of `setInterval(callback, interval)` but use visibility |
| 21 | // state. |
| 22 | // |
| 23 | // It return timer ID, that you can use in `Visibility.stop(id)` to stop |
| 24 | // timer (`clearInterval` analog). |
| 25 | // Warning: timer ID is different from interval ID from `setInterval`, |
| 26 | // so don’t use it in `clearInterval`. |
| 27 | // |
| 28 | // On change state from hidden to visible timers will be execute. |
| 29 | Visibility.every = function (interval, hiddenInterval, callback) { |
| 30 | Visibility._time(); |
| 31 | |
| 32 | if ( !callback ) { |
| 33 | callback = hiddenInterval; |
| 34 | hiddenInterval = null; |
| 35 | } |
| 36 | |
| 37 | lastTimer += 1; |
| 38 | var number = lastTimer; |
| 39 | |
| 40 | Visibility._timers[number] = { |
| 41 | visible: interval, |
| 42 | hidden: hiddenInterval, |
| 43 | callback: callback |
| 44 | }; |
| 45 | Visibility._run(number, false); |
| 46 | |
| 47 | if ( Visibility.isSupported() ) { |
| 48 | Visibility._listen(); |
| 49 | } |
| 50 | return number; |
| 51 | }; |
| 52 | |
| 53 | // Stop timer from `every` method by it ID (`every` method return it). |
| 54 | // |
| 55 | // slideshow = Visibility.every(5 * 1000, function () { |
| 56 | // changeSlide(); |
| 57 | // }); |
| 58 | // $('.stopSlideshow').click(function () { |
| 59 | // Visibility.stop(slideshow); |
| 60 | // }); |
| 61 | Visibility.stop = function(id) { |
| 62 | if ( !Visibility._timers[id] ) { |
| 63 | return false; |
| 64 | } |
| 65 | Visibility._stop(id); |
| 66 | delete Visibility._timers[id]; |
| 67 | return true; |
| 68 | }; |
| 69 | |
| 70 | // Callbacks and intervals added by `every` method. |
| 71 | Visibility._timers = { }; |
| 72 | |
| 73 | // Initialize variables on page loading. |
| 74 | Visibility._time = function () { |
| 75 | if ( Visibility._timed ) { |
| 76 | return; |
| 77 | } |
| 78 | Visibility._timed = true; |
| 79 | Visibility._wasHidden = Visibility.hidden(); |
| 80 | |
| 81 | Visibility.change(function () { |
| 82 | Visibility._stopRun(); |
| 83 | Visibility._wasHidden = Visibility.hidden(); |
| 84 | }); |
| 85 | }; |
| 86 | |
| 87 | // Try to run timer from every method by it’s ID. It will be use |
| 88 | // `interval` or `hiddenInterval` depending on visibility state. |
| 89 | // If page is hidden and `hiddenInterval` is null, |
| 90 | // it will not run timer. |
| 91 | // |
| 92 | // Argument `runNow` say, that timers must be execute now too. |
| 93 | Visibility._run = function (id, runNow) { |
| 94 | var interval, |
| 95 | timer = Visibility._timers[id]; |
| 96 | |
| 97 | if ( Visibility.hidden() ) { |
| 98 | if ( null === timer.hidden ) { |
| 99 | return; |
| 100 | } |
| 101 | interval = timer.hidden; |
| 102 | } else { |
| 103 | interval = timer.visible; |
| 104 | } |
| 105 | |
| 106 | var runner = function () { |
| 107 | timer.last = new Date(); |
| 108 | timer.callback.call(window); |
| 109 | } |
| 110 | |
| 111 | if ( runNow ) { |
| 112 | var now = new Date(); |
| 113 | var last = now - timer.last ; |
| 114 | |
| 115 | if ( interval > last ) { |
| 116 | timer.delay = setTimeout(function () { |
| 117 | timer.id = setInterval(runner, interval); |
| 118 | runner(); |
| 119 | }, interval - last); |
| 120 | } else { |
| 121 | timer.id = setInterval(runner, interval); |
| 122 | runner(); |
| 123 | } |
| 124 | |
| 125 | } else { |
| 126 | timer.id = setInterval(runner, interval); |
| 127 | } |
| 128 | }; |
| 129 | |
| 130 | // Stop timer from `every` method by it’s ID. |
| 131 | Visibility._stop = function (id) { |
| 132 | var timer = Visibility._timers[id]; |
| 133 | clearInterval(timer.id); |
| 134 | clearTimeout(timer.delay); |
| 135 | delete timer.id; |
| 136 | delete timer.delay; |
| 137 | }; |
| 138 | |
| 139 | // Listener for `visibilitychange` event. |
| 140 | Visibility._stopRun = function (event) { |
| 141 | var isHidden = Visibility.hidden(), |
| 142 | wasHidden = Visibility._wasHidden; |
| 143 | |
| 144 | if ( (isHidden && !wasHidden) || (!isHidden && wasHidden) ) { |
| 145 | for ( var i in Visibility._timers ) { |
| 146 | Visibility._stop(i); |
| 147 | Visibility._run(i, !isHidden); |
| 148 | } |
| 149 | } |
| 150 | }; |
| 151 | |
| 152 | return Visibility; |
| 153 | } |
| 154 | |
| 155 | if ( typeof(module) != 'undefined' && module.exports ) { |
| 156 | module.exports = install(require('./visibility.core')); |
| 157 | } else { |
| 158 | install(window.Visibility || require('./visibility.core')) |
| 159 | } |
| 160 | |
| 161 | })(window); |
| 162 |