visibilityjs 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/{ChangeLog → ChangeLog.md} +20 -14
- data/LICENSE +20 -165
- data/README.md +20 -20
- data/lib/assets/javascripts/visibility.core.js +20 -38
- data/lib/assets/javascripts/visibility.fallback.js +2 -21
- data/lib/assets/javascripts/visibility.js +169 -170
- data/lib/assets/javascripts/visibility.timers.js +149 -150
- metadata +19 -23
@@ -1,21 +1,3 @@
|
|
1
|
-
/*
|
2
|
-
* Copyright 2011 Andrey “A.I.” Sitnik <andrey@sitnik.ru>,
|
3
|
-
* sponsored by Evil Martians.
|
4
|
-
*
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
6
|
-
* it under the terms of the GNU Lesser General Public License as published by
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
8
|
-
* (at your option) any later version.
|
9
|
-
*
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
* GNU Lesser General Public License for more details.
|
14
|
-
*
|
15
|
-
* You should have received a copy of the GNU Lesser General Public License
|
16
|
-
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
-
*/
|
18
|
-
|
19
1
|
;(function (undefined) {
|
20
2
|
"use strict";
|
21
3
|
|
@@ -73,10 +55,10 @@
|
|
73
55
|
if ( !self.isSupported() ) {
|
74
56
|
return false;
|
75
57
|
}
|
76
|
-
self.
|
77
|
-
var number = self.
|
58
|
+
self._lastId += 1;
|
59
|
+
var number = self._lastId;
|
78
60
|
self._callbacks[number] = callback;
|
79
|
-
self.
|
61
|
+
self._listen();
|
80
62
|
return number;
|
81
63
|
},
|
82
64
|
|
@@ -160,36 +142,36 @@
|
|
160
142
|
_doc: window.document,
|
161
143
|
|
162
144
|
// Vendor prefix cached by `_prefix` function.
|
163
|
-
|
145
|
+
_cached: null,
|
164
146
|
|
165
147
|
// Is listener for `visibilitychange` event is already added
|
166
|
-
// by `
|
167
|
-
|
148
|
+
// by `_listen` method.
|
149
|
+
_enable: false,
|
168
150
|
|
169
151
|
// Last timer number.
|
170
|
-
|
152
|
+
_lastId: -1,
|
171
153
|
|
172
154
|
// Callbacks from `change` method, that wait visibility changes.
|
173
155
|
_callbacks: { },
|
174
156
|
|
175
157
|
// Variable to check hidden-visible state changes.
|
176
|
-
|
158
|
+
_wasHidden: false,
|
177
159
|
|
178
160
|
// Initialize variables on page loading.
|
179
161
|
_init: function () {
|
180
|
-
self.
|
162
|
+
self._wasHidden = self.hidden();
|
181
163
|
},
|
182
164
|
|
183
165
|
// Detect vendor prefix and return it.
|
184
166
|
_prefix: function () {
|
185
|
-
if ( null !== self.
|
186
|
-
return self.
|
167
|
+
if ( null !== self._cached ) {
|
168
|
+
return self._cached;
|
187
169
|
}
|
188
170
|
if ( defined(self._doc.visibilityState) ) {
|
189
|
-
return self.
|
171
|
+
return self._cached = '';
|
190
172
|
}
|
191
173
|
if ( defined(self._doc.webkitVisibilityState) ) {
|
192
|
-
return self.
|
174
|
+
return self._cached = 'webkit';
|
193
175
|
}
|
194
176
|
},
|
195
177
|
|
@@ -214,32 +196,32 @@
|
|
214
196
|
},
|
215
197
|
|
216
198
|
// Listener for `visibilitychange` event.
|
217
|
-
|
199
|
+
_change: function(event) {
|
218
200
|
var state = self.state();
|
219
201
|
|
220
202
|
for ( var i in self._callbacks ) {
|
221
203
|
self._callbacks[i].call(self._doc, event, state);
|
222
204
|
}
|
223
205
|
|
224
|
-
self.
|
206
|
+
self._wasHidden = self.hidden();
|
225
207
|
},
|
226
208
|
|
227
209
|
// Set listener for `visibilitychange` event.
|
228
|
-
|
229
|
-
if ( self.
|
210
|
+
_listen: function () {
|
211
|
+
if ( self._enable ) {
|
230
212
|
return;
|
231
213
|
}
|
232
214
|
var event = self._prefix() + 'visibilitychange';
|
233
215
|
var listener = function () {
|
234
|
-
self.
|
216
|
+
self._change.apply(Visibility, arguments);
|
235
217
|
};
|
236
218
|
if ( self._doc.addEventListener ) {
|
237
219
|
self._doc.addEventListener(event, listener, false);
|
238
220
|
} else {
|
239
221
|
self._doc.attachEvent(event, listener);
|
240
222
|
}
|
241
|
-
self.
|
242
|
-
self.
|
223
|
+
self._enable = true;
|
224
|
+
self._wasHidden = self.hidden();
|
243
225
|
}
|
244
226
|
|
245
227
|
};
|
@@ -249,138 +231,155 @@
|
|
249
231
|
|
250
232
|
var timers = {
|
251
233
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
234
|
+
// Run callback every `interval` milliseconds if page is visible and
|
235
|
+
// every `hiddenInterval` milliseconds if page is hidden.
|
236
|
+
//
|
237
|
+
// Visibility.every(60 * 1000, 5 * 60 * 1000, function () {
|
238
|
+
// checkNewMails();
|
239
|
+
// });
|
240
|
+
//
|
241
|
+
// You can skip `hiddenInterval` and callback will be called only if
|
242
|
+
// page is visible.
|
243
|
+
//
|
244
|
+
// Visibility.every(1000, function () {
|
245
|
+
// updateCountdown();
|
246
|
+
// });
|
247
|
+
//
|
248
|
+
// It is analog of `setInterval(callback, interval)` but use visibility
|
249
|
+
// state.
|
250
|
+
//
|
251
|
+
// It return timer ID, that you can use in `Visibility.stop(id)` to stop
|
252
|
+
// timer (`clearInterval` analog).
|
253
|
+
// Warning: timer ID is different from interval ID from `setInterval`,
|
254
|
+
// so don’t use it in `clearInterval`.
|
255
|
+
//
|
256
|
+
// On change state from hidden to visible timers will be execute.
|
257
|
+
every: function (interval, hiddenInterval, callback) {
|
258
|
+
self._time();
|
259
|
+
|
260
|
+
if ( !defined(callback) ) {
|
261
|
+
callback = hiddenInterval;
|
262
|
+
hiddenInterval = null;
|
263
|
+
}
|
264
|
+
|
265
|
+
self._lastTimer += 1;
|
266
|
+
var number = self._lastTimer;
|
267
|
+
|
268
|
+
self._timers[number] = {
|
269
|
+
visible: interval,
|
270
|
+
hidden: hiddenInterval,
|
271
|
+
callback: callback
|
272
|
+
};
|
273
|
+
self._run(number, false);
|
274
|
+
|
275
|
+
if ( self.isSupported() ) {
|
276
|
+
self._listen();
|
277
|
+
}
|
278
|
+
return number;
|
279
|
+
},
|
280
|
+
|
281
|
+
// Stop timer from `every` method by it ID (`every` method return it).
|
282
|
+
//
|
283
|
+
// slideshow = Visibility.every(5 * 1000, function () {
|
284
|
+
// changeSlide();
|
285
|
+
// });
|
286
|
+
// $('.stopSlideshow').click(function () {
|
287
|
+
// Visibility.stop(slideshow);
|
288
|
+
// });
|
289
|
+
stop: function(id) {
|
290
|
+
var timer = self._timers[id]
|
291
|
+
if ( !defined(timer) ) {
|
292
|
+
return false;
|
293
|
+
}
|
294
|
+
self._stop(id);
|
295
|
+
delete self._timers[id];
|
296
|
+
return timer;
|
297
|
+
},
|
298
|
+
|
299
|
+
// Last timer number.
|
300
|
+
_lastTimer: -1,
|
301
|
+
|
302
|
+
// Callbacks and intervals added by `every` method.
|
303
|
+
_timers: { },
|
304
|
+
|
305
|
+
// Is setInterval method detected and listener is binded.
|
306
|
+
_timed: false,
|
307
|
+
|
308
|
+
// Initialize variables on page loading.
|
309
|
+
_time: function () {
|
310
|
+
if ( self._timed ) {
|
311
|
+
return;
|
312
|
+
}
|
313
|
+
self._timed = true;
|
314
|
+
|
315
|
+
self.change(function () {
|
316
|
+
self._stopRun()
|
317
|
+
});
|
318
|
+
},
|
319
|
+
|
320
|
+
// Try to run timer from every method by it’s ID. It will be use
|
321
|
+
// `interval` or `hiddenInterval` depending on visibility state.
|
322
|
+
// If page is hidden and `hiddenInterval` is null,
|
323
|
+
// it will not run timer.
|
324
|
+
//
|
325
|
+
// Argument `runNow` say, that timers must be execute now too.
|
326
|
+
_run: function (id, runNow) {
|
327
|
+
var interval,
|
328
|
+
timer = self._timers[id];
|
329
|
+
if ( self.hidden() ) {
|
330
|
+
if ( null === timer.hidden ) {
|
331
|
+
return;
|
332
|
+
}
|
333
|
+
interval = timer.hidden;
|
334
|
+
} else {
|
335
|
+
interval = timer.visible;
|
336
|
+
}
|
337
|
+
|
338
|
+
var runner = function () {
|
339
|
+
timer.last = new Date();
|
340
|
+
timer.callback.call(window);
|
341
|
+
}
|
342
|
+
|
343
|
+
if ( runNow ) {
|
344
|
+
var now = new Date();
|
345
|
+
var last = now - timer.last ;
|
346
|
+
|
347
|
+
if ( interval > last ) {
|
348
|
+
timer.delay = setTimeout(function () {
|
349
|
+
runner();
|
350
|
+
timer.id = setInterval(runner, interval);
|
351
|
+
}, interval - last);
|
352
|
+
} else {
|
353
|
+
runner();
|
354
|
+
timer.id = setInterval(runner, interval);
|
355
|
+
}
|
356
|
+
|
357
|
+
} else {
|
358
|
+
timer.id = setInterval(runner, interval);
|
359
|
+
}
|
360
|
+
},
|
361
|
+
|
362
|
+
// Stop timer from `every` method by it’s ID.
|
363
|
+
_stop: function (id) {
|
364
|
+
var timer = self._timers[id];
|
365
|
+
clearInterval(timer.id);
|
366
|
+
clearTimeout(timer.delay);
|
367
|
+
delete timer.id;
|
368
|
+
delete timer.delay;
|
369
|
+
},
|
370
|
+
|
371
|
+
// Listener for `visibilitychange` event.
|
372
|
+
_stopRun: function (event) {
|
373
|
+
var isHidden = self.hidden(),
|
374
|
+
wasHidden = self._wasHidden;
|
375
|
+
|
376
|
+
if ( (isHidden && !wasHidden) || (!isHidden && wasHidden) ) {
|
377
|
+
for ( var i in self._timers ) {
|
378
|
+
self._stop(i);
|
379
|
+
self._run(i, !isHidden);
|
380
|
+
}
|
381
|
+
}
|
382
|
+
}
|
384
383
|
|
385
384
|
};
|
386
385
|
|