visibilityjs 0.6.1 → 0.6.2
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.
data/ChangeLog
CHANGED
data/README.md
CHANGED
|
@@ -21,7 +21,7 @@ actually supported in the browser as, if it does not, the library will just
|
|
|
21
21
|
assume that the page is visible all the time, and your logic will still work
|
|
22
22
|
correctly, albeit less effective in some cases.
|
|
23
23
|
|
|
24
|
-
Page Visibility API is natively supported by Google Chrome 13, Firefox 10,
|
|
24
|
+
Page Visibility API is [natively supported] by Google Chrome 13, Firefox 10,
|
|
25
25
|
Opera 12.10 and IE 10. For old browsers you can use `lib/visibility.fallback.js`
|
|
26
26
|
with focus/blur hack (note that this hack have issue, that document become
|
|
27
27
|
to be hidden, when browser just lose focus, but still visible for user).
|
|
@@ -31,6 +31,7 @@ Sponsored by [Evil Martians].
|
|
|
31
31
|
[Page Visibility API]: http://www.w3.org/TR/2011/WD-page-visibility-20110602/
|
|
32
32
|
[prerendering]: http://code.google.com/chrome/whitepapers/prerender.html
|
|
33
33
|
[MozVisibility]: https://github.com/private-face/mozvisibility
|
|
34
|
+
[natively supported]: http://caniuse.com/#feat=pagevisibility
|
|
34
35
|
[Evil Martians]: http://evilmartians.com/
|
|
35
36
|
|
|
36
37
|
## Translations
|
|
@@ -296,7 +297,7 @@ For Ruby on Rails you can use gem for Assets Pipeline.
|
|
|
296
297
|
If you don’t use any assets packaging manager use [CDNJS]. Add to your site:
|
|
297
298
|
|
|
298
299
|
```html
|
|
299
|
-
<script src="//cdnjs.cloudflare.com/ajax/libs/visibility.js/0.6.
|
|
300
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/visibility.js/0.6.2/visibility.min.js"></script>
|
|
300
301
|
```
|
|
301
302
|
|
|
302
303
|
[CDNJS]: http://cdnjs.com/
|
|
@@ -322,14 +323,20 @@ If you need just a files, you can take already minified packages from
|
|
|
322
323
|
npm install
|
|
323
324
|
```
|
|
324
325
|
|
|
325
|
-
3. Run
|
|
326
|
+
3. Run all tests:
|
|
326
327
|
|
|
327
328
|
```sh
|
|
328
329
|
./node_modules/.bin/cake test
|
|
329
330
|
```
|
|
330
331
|
|
|
331
|
-
4.
|
|
332
|
-
|
|
332
|
+
4. Run test server, to check code in real browsers:
|
|
333
|
+
|
|
334
|
+
```sh
|
|
335
|
+
./node_modules/.bin/cake server
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
5. Open tests in browser: [localhost:8000].
|
|
339
|
+
6. Also you can see real usage example in integration test
|
|
333
340
|
`test/integration.html`.
|
|
334
341
|
|
|
335
342
|
[localhost:8000]: http://localhost:8000
|
|
@@ -16,18 +16,18 @@
|
|
|
16
16
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
;(function () {
|
|
19
|
+
;(function (undefined) {
|
|
20
20
|
"use strict";
|
|
21
21
|
|
|
22
22
|
var defined = function (variable) {
|
|
23
|
-
return (
|
|
23
|
+
return (variable != undefined);
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
// Visibility.js allow you to know, that your web page is in the background
|
|
27
27
|
// tab and thus not visible to the user. This library is wrap under
|
|
28
28
|
// Page Visibility API. It fix problems with different vendor prefixes and
|
|
29
29
|
// add high-level useful functions.
|
|
30
|
-
window.Visibility = {
|
|
30
|
+
var self = window.Visibility = {
|
|
31
31
|
|
|
32
32
|
// Call callback only when page become to visible for user or
|
|
33
33
|
// call it now if page is visible now or Page Visibility API
|
|
@@ -41,14 +41,14 @@
|
|
|
41
41
|
// startIntroAnimation();
|
|
42
42
|
// });
|
|
43
43
|
onVisible: function (callback) {
|
|
44
|
-
if ( !
|
|
44
|
+
if ( !self.isSupported() || !self.hidden() ) {
|
|
45
45
|
callback();
|
|
46
|
-
return
|
|
46
|
+
return self.isSupported();
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
var listener =
|
|
50
|
-
if ( !
|
|
51
|
-
|
|
49
|
+
var listener = self.change(function (e, state) {
|
|
50
|
+
if ( !self.hidden() ) {
|
|
51
|
+
self.unbind(listener);
|
|
52
52
|
callback();
|
|
53
53
|
}
|
|
54
54
|
});
|
|
@@ -70,13 +70,13 @@
|
|
|
70
70
|
//
|
|
71
71
|
// It is just proxy to `visibilitychange` event, but use vendor prefix.
|
|
72
72
|
change: function (callback) {
|
|
73
|
-
if ( !
|
|
73
|
+
if ( !self.isSupported() ) {
|
|
74
74
|
return false;
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
var number =
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
self._lastCallback += 1;
|
|
77
|
+
var number = self._lastCallback;
|
|
78
|
+
self._callbacks[number] = callback;
|
|
79
|
+
self._setListener();
|
|
80
80
|
return number;
|
|
81
81
|
},
|
|
82
82
|
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
// Visibility.unbind(id);
|
|
88
88
|
// });
|
|
89
89
|
unbind: function (id) {
|
|
90
|
-
delete
|
|
90
|
+
delete self._callbacks[id];
|
|
91
91
|
},
|
|
92
92
|
|
|
93
93
|
// Call `callback` in any state, expect “prerender”. If current state
|
|
@@ -103,14 +103,14 @@
|
|
|
103
103
|
// Statistics.countVisitor();
|
|
104
104
|
// });
|
|
105
105
|
afterPrerendering: function (callback) {
|
|
106
|
-
if ( !
|
|
106
|
+
if ( !self.isSupported() || 'prerender' != self.state() ) {
|
|
107
107
|
callback();
|
|
108
|
-
return
|
|
108
|
+
return self.isSupported();
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
var listener =
|
|
111
|
+
var listener = self.change(function (e, state) {
|
|
112
112
|
if ( 'prerender' != state ) {
|
|
113
|
-
|
|
113
|
+
self.unbind(listener);
|
|
114
114
|
callback();
|
|
115
115
|
}
|
|
116
116
|
});
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
//
|
|
126
126
|
// It is just proxy to `document.hidden`, but use vendor prefix.
|
|
127
127
|
hidden: function () {
|
|
128
|
-
return
|
|
128
|
+
return self._prop('hidden', false);
|
|
129
129
|
},
|
|
130
130
|
|
|
131
131
|
// Return visibility state: 'visible', 'hidden' or 'prerender'.
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
// It is just proxy to `document.visibilityState`, but use
|
|
142
142
|
// vendor prefix.
|
|
143
143
|
state: function () {
|
|
144
|
-
return
|
|
144
|
+
return self._prop('visibilityState', 'visible');
|
|
145
145
|
},
|
|
146
146
|
|
|
147
147
|
// Return true if browser support Page Visibility API.
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
// });
|
|
154
154
|
// }
|
|
155
155
|
isSupported: function () {
|
|
156
|
-
return defined(
|
|
156
|
+
return defined(self._prefix());
|
|
157
157
|
},
|
|
158
158
|
|
|
159
159
|
// Link to document object to change it in tests.
|
|
@@ -180,29 +180,29 @@
|
|
|
180
180
|
|
|
181
181
|
// Initialize variables on page loading.
|
|
182
182
|
_init: function () {
|
|
183
|
-
|
|
183
|
+
self._hiddenBefore = self.hidden();
|
|
184
184
|
},
|
|
185
185
|
|
|
186
186
|
// Detect vendor prefix and return it.
|
|
187
187
|
_prefix: function () {
|
|
188
|
-
if ( null !==
|
|
189
|
-
return
|
|
188
|
+
if ( null !== self._chechedPrefix ) {
|
|
189
|
+
return self._chechedPrefix;
|
|
190
190
|
}
|
|
191
|
-
if ( defined(
|
|
192
|
-
return
|
|
191
|
+
if ( defined(self._doc.visibilityState) ) {
|
|
192
|
+
return self._chechedPrefix = '';
|
|
193
193
|
}
|
|
194
194
|
var name;
|
|
195
|
-
for ( var i = 0; i <
|
|
196
|
-
name =
|
|
197
|
-
if ( defined(
|
|
198
|
-
return
|
|
195
|
+
for ( var i = 0; i < self._prefixes.length; i++ ) {
|
|
196
|
+
name = self._prefixes[i] + 'VisibilityState';
|
|
197
|
+
if ( defined(self._doc[name]) ) {
|
|
198
|
+
return self._chechedPrefix = self._prefixes[i];
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
},
|
|
202
202
|
|
|
203
203
|
// Return property name with vendor prefix.
|
|
204
204
|
_name: function (name) {
|
|
205
|
-
var prefix =
|
|
205
|
+
var prefix = self._prefix();
|
|
206
206
|
if ( '' == prefix ) {
|
|
207
207
|
return name;
|
|
208
208
|
} else {
|
|
@@ -214,43 +214,43 @@
|
|
|
214
214
|
// Return document’s property value with name with vendor prefix.
|
|
215
215
|
// If API is not support, it will retun `unsupported` value.
|
|
216
216
|
_prop: function (name, unsupported) {
|
|
217
|
-
if ( !
|
|
217
|
+
if ( !self.isSupported() ) {
|
|
218
218
|
return unsupported;
|
|
219
219
|
}
|
|
220
|
-
return
|
|
220
|
+
return self._doc[self._name(name)];
|
|
221
221
|
},
|
|
222
222
|
|
|
223
223
|
// Listener for `visibilitychange` event.
|
|
224
224
|
_onChange: function(event) {
|
|
225
|
-
var state =
|
|
225
|
+
var state = self.state();
|
|
226
226
|
|
|
227
|
-
for ( var i in
|
|
228
|
-
|
|
227
|
+
for ( var i in self._callbacks ) {
|
|
228
|
+
self._callbacks[i].call(self._doc, event, state);
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
self._hiddenBefore = self.hidden();
|
|
232
232
|
},
|
|
233
233
|
|
|
234
234
|
// Set listener for `visibilitychange` event.
|
|
235
235
|
_setListener: function () {
|
|
236
|
-
if (
|
|
236
|
+
if ( self._listening ) {
|
|
237
237
|
return;
|
|
238
238
|
}
|
|
239
|
-
var event =
|
|
239
|
+
var event = self._prefix() + 'visibilitychange';
|
|
240
240
|
var listener = function () {
|
|
241
|
-
|
|
241
|
+
self._onChange.apply(Visibility, arguments);
|
|
242
242
|
};
|
|
243
|
-
if (
|
|
244
|
-
|
|
243
|
+
if ( self._doc.addEventListener ) {
|
|
244
|
+
self._doc.addEventListener(event, listener, false);
|
|
245
245
|
} else {
|
|
246
|
-
|
|
246
|
+
self._doc.attachEvent(event, listener);
|
|
247
247
|
}
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
self._listening = true;
|
|
249
|
+
self._hiddenBefore = self.hidden();
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
};
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
self._init();
|
|
255
255
|
|
|
256
256
|
})();
|
|
@@ -16,18 +16,18 @@
|
|
|
16
16
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
;(function () {
|
|
19
|
+
;(function (undefined) {
|
|
20
20
|
"use strict";
|
|
21
21
|
|
|
22
22
|
var defined = function (variable) {
|
|
23
|
-
return (
|
|
23
|
+
return (variable != undefined);
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
// Visibility.js allow you to know, that your web page is in the background
|
|
27
27
|
// tab and thus not visible to the user. This library is wrap under
|
|
28
28
|
// Page Visibility API. It fix problems with different vendor prefixes and
|
|
29
29
|
// add high-level useful functions.
|
|
30
|
-
window.Visibility = {
|
|
30
|
+
var self = window.Visibility = {
|
|
31
31
|
|
|
32
32
|
// Call callback only when page become to visible for user or
|
|
33
33
|
// call it now if page is visible now or Page Visibility API
|
|
@@ -41,14 +41,14 @@
|
|
|
41
41
|
// startIntroAnimation();
|
|
42
42
|
// });
|
|
43
43
|
onVisible: function (callback) {
|
|
44
|
-
if ( !
|
|
44
|
+
if ( !self.isSupported() || !self.hidden() ) {
|
|
45
45
|
callback();
|
|
46
|
-
return
|
|
46
|
+
return self.isSupported();
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
var listener =
|
|
50
|
-
if ( !
|
|
51
|
-
|
|
49
|
+
var listener = self.change(function (e, state) {
|
|
50
|
+
if ( !self.hidden() ) {
|
|
51
|
+
self.unbind(listener);
|
|
52
52
|
callback();
|
|
53
53
|
}
|
|
54
54
|
});
|
|
@@ -70,13 +70,13 @@
|
|
|
70
70
|
//
|
|
71
71
|
// It is just proxy to `visibilitychange` event, but use vendor prefix.
|
|
72
72
|
change: function (callback) {
|
|
73
|
-
if ( !
|
|
73
|
+
if ( !self.isSupported() ) {
|
|
74
74
|
return false;
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
var number =
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
self._lastCallback += 1;
|
|
77
|
+
var number = self._lastCallback;
|
|
78
|
+
self._callbacks[number] = callback;
|
|
79
|
+
self._setListener();
|
|
80
80
|
return number;
|
|
81
81
|
},
|
|
82
82
|
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
// Visibility.unbind(id);
|
|
88
88
|
// });
|
|
89
89
|
unbind: function (id) {
|
|
90
|
-
delete
|
|
90
|
+
delete self._callbacks[id];
|
|
91
91
|
},
|
|
92
92
|
|
|
93
93
|
// Call `callback` in any state, expect “prerender”. If current state
|
|
@@ -103,14 +103,14 @@
|
|
|
103
103
|
// Statistics.countVisitor();
|
|
104
104
|
// });
|
|
105
105
|
afterPrerendering: function (callback) {
|
|
106
|
-
if ( !
|
|
106
|
+
if ( !self.isSupported() || 'prerender' != self.state() ) {
|
|
107
107
|
callback();
|
|
108
|
-
return
|
|
108
|
+
return self.isSupported();
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
var listener =
|
|
111
|
+
var listener = self.change(function (e, state) {
|
|
112
112
|
if ( 'prerender' != state ) {
|
|
113
|
-
|
|
113
|
+
self.unbind(listener);
|
|
114
114
|
callback();
|
|
115
115
|
}
|
|
116
116
|
});
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
//
|
|
126
126
|
// It is just proxy to `document.hidden`, but use vendor prefix.
|
|
127
127
|
hidden: function () {
|
|
128
|
-
return
|
|
128
|
+
return self._prop('hidden', false);
|
|
129
129
|
},
|
|
130
130
|
|
|
131
131
|
// Return visibility state: 'visible', 'hidden' or 'prerender'.
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
// It is just proxy to `document.visibilityState`, but use
|
|
142
142
|
// vendor prefix.
|
|
143
143
|
state: function () {
|
|
144
|
-
return
|
|
144
|
+
return self._prop('visibilityState', 'visible');
|
|
145
145
|
},
|
|
146
146
|
|
|
147
147
|
// Return true if browser support Page Visibility API.
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
// });
|
|
154
154
|
// }
|
|
155
155
|
isSupported: function () {
|
|
156
|
-
return defined(
|
|
156
|
+
return defined(self._prefix());
|
|
157
157
|
},
|
|
158
158
|
|
|
159
159
|
// Link to document object to change it in tests.
|
|
@@ -180,29 +180,29 @@
|
|
|
180
180
|
|
|
181
181
|
// Initialize variables on page loading.
|
|
182
182
|
_init: function () {
|
|
183
|
-
|
|
183
|
+
self._hiddenBefore = self.hidden();
|
|
184
184
|
},
|
|
185
185
|
|
|
186
186
|
// Detect vendor prefix and return it.
|
|
187
187
|
_prefix: function () {
|
|
188
|
-
if ( null !==
|
|
189
|
-
return
|
|
188
|
+
if ( null !== self._chechedPrefix ) {
|
|
189
|
+
return self._chechedPrefix;
|
|
190
190
|
}
|
|
191
|
-
if ( defined(
|
|
192
|
-
return
|
|
191
|
+
if ( defined(self._doc.visibilityState) ) {
|
|
192
|
+
return self._chechedPrefix = '';
|
|
193
193
|
}
|
|
194
194
|
var name;
|
|
195
|
-
for ( var i = 0; i <
|
|
196
|
-
name =
|
|
197
|
-
if ( defined(
|
|
198
|
-
return
|
|
195
|
+
for ( var i = 0; i < self._prefixes.length; i++ ) {
|
|
196
|
+
name = self._prefixes[i] + 'VisibilityState';
|
|
197
|
+
if ( defined(self._doc[name]) ) {
|
|
198
|
+
return self._chechedPrefix = self._prefixes[i];
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
},
|
|
202
202
|
|
|
203
203
|
// Return property name with vendor prefix.
|
|
204
204
|
_name: function (name) {
|
|
205
|
-
var prefix =
|
|
205
|
+
var prefix = self._prefix();
|
|
206
206
|
if ( '' == prefix ) {
|
|
207
207
|
return name;
|
|
208
208
|
} else {
|
|
@@ -214,44 +214,44 @@
|
|
|
214
214
|
// Return document’s property value with name with vendor prefix.
|
|
215
215
|
// If API is not support, it will retun `unsupported` value.
|
|
216
216
|
_prop: function (name, unsupported) {
|
|
217
|
-
if ( !
|
|
217
|
+
if ( !self.isSupported() ) {
|
|
218
218
|
return unsupported;
|
|
219
219
|
}
|
|
220
|
-
return
|
|
220
|
+
return self._doc[self._name(name)];
|
|
221
221
|
},
|
|
222
222
|
|
|
223
223
|
// Listener for `visibilitychange` event.
|
|
224
224
|
_onChange: function(event) {
|
|
225
|
-
var state =
|
|
225
|
+
var state = self.state();
|
|
226
226
|
|
|
227
|
-
for ( var i in
|
|
228
|
-
|
|
227
|
+
for ( var i in self._callbacks ) {
|
|
228
|
+
self._callbacks[i].call(self._doc, event, state);
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
self._hiddenBefore = self.hidden();
|
|
232
232
|
},
|
|
233
233
|
|
|
234
234
|
// Set listener for `visibilitychange` event.
|
|
235
235
|
_setListener: function () {
|
|
236
|
-
if (
|
|
236
|
+
if ( self._listening ) {
|
|
237
237
|
return;
|
|
238
238
|
}
|
|
239
|
-
var event =
|
|
239
|
+
var event = self._prefix() + 'visibilitychange';
|
|
240
240
|
var listener = function () {
|
|
241
|
-
|
|
241
|
+
self._onChange.apply(Visibility, arguments);
|
|
242
242
|
};
|
|
243
|
-
if (
|
|
244
|
-
|
|
243
|
+
if ( self._doc.addEventListener ) {
|
|
244
|
+
self._doc.addEventListener(event, listener, false);
|
|
245
245
|
} else {
|
|
246
|
-
|
|
246
|
+
self._doc.attachEvent(event, listener);
|
|
247
247
|
}
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
self._listening = true;
|
|
249
|
+
self._hiddenBefore = self.hidden();
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
};
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
self._init();
|
|
255
255
|
|
|
256
256
|
|
|
257
257
|
var timers = {
|
|
@@ -290,23 +290,23 @@
|
|
|
290
290
|
// checkNewMails();
|
|
291
291
|
// });
|
|
292
292
|
every: function (interval, hiddenInterval, callback) {
|
|
293
|
-
|
|
293
|
+
self._initTimers();
|
|
294
294
|
|
|
295
295
|
if ( !defined(callback) ) {
|
|
296
296
|
callback = hiddenInterval;
|
|
297
297
|
hiddenInterval = null;
|
|
298
298
|
}
|
|
299
|
-
|
|
300
|
-
var number =
|
|
301
|
-
|
|
299
|
+
self._lastTimer += 1;
|
|
300
|
+
var number = self._lastTimer;
|
|
301
|
+
self._timers[number] = ({
|
|
302
302
|
interval: interval,
|
|
303
303
|
hiddenInterval: hiddenInterval,
|
|
304
304
|
callback: callback
|
|
305
305
|
});
|
|
306
|
-
|
|
306
|
+
self._runTimer(number, false);
|
|
307
307
|
|
|
308
|
-
if (
|
|
309
|
-
|
|
308
|
+
if ( self.isSupported() ) {
|
|
309
|
+
self._setListener();
|
|
310
310
|
}
|
|
311
311
|
return number;
|
|
312
312
|
},
|
|
@@ -320,12 +320,12 @@
|
|
|
320
320
|
// Visibility.stop(slideshow);
|
|
321
321
|
// });
|
|
322
322
|
stop: function(id) {
|
|
323
|
-
var timer =
|
|
323
|
+
var timer = self._timers[id]
|
|
324
324
|
if ( !defined(timer) ) {
|
|
325
325
|
return false;
|
|
326
326
|
}
|
|
327
|
-
|
|
328
|
-
delete
|
|
327
|
+
self._stopTimer(id);
|
|
328
|
+
delete self._timers[id];
|
|
329
329
|
return timer;
|
|
330
330
|
},
|
|
331
331
|
|
|
@@ -340,18 +340,18 @@
|
|
|
340
340
|
|
|
341
341
|
// Initialize variables on page loading.
|
|
342
342
|
_initTimers: function () {
|
|
343
|
-
if (
|
|
343
|
+
if ( self._timersInitialized ) {
|
|
344
344
|
return;
|
|
345
345
|
}
|
|
346
|
-
|
|
346
|
+
self._timersInitialized = true;
|
|
347
347
|
|
|
348
348
|
if ( defined(window.jQuery) && defined(jQuery.every) ) {
|
|
349
|
-
|
|
349
|
+
self._setInterval = self._chronoInterval;
|
|
350
350
|
} else {
|
|
351
|
-
|
|
351
|
+
self._setInterval = self._originalInterval;
|
|
352
352
|
}
|
|
353
|
-
|
|
354
|
-
|
|
353
|
+
self.change(function () {
|
|
354
|
+
self._timersStopRun()
|
|
355
355
|
});
|
|
356
356
|
},
|
|
357
357
|
|
|
@@ -386,8 +386,8 @@
|
|
|
386
386
|
// Argument `now` say, that timers must be execute now too.
|
|
387
387
|
_runTimer: function (id, now) {
|
|
388
388
|
var interval,
|
|
389
|
-
timer =
|
|
390
|
-
if (
|
|
389
|
+
timer = self._timers[id];
|
|
390
|
+
if ( self.hidden() ) {
|
|
391
391
|
if ( null === timer.hiddenInterval ) {
|
|
392
392
|
return;
|
|
393
393
|
}
|
|
@@ -398,25 +398,25 @@
|
|
|
398
398
|
if ( now ) {
|
|
399
399
|
timer.callback.call(window);
|
|
400
400
|
}
|
|
401
|
-
timer.id =
|
|
401
|
+
timer.id = self._setInterval(timer.callback, interval);
|
|
402
402
|
},
|
|
403
403
|
|
|
404
404
|
// Stop timer from `every` method by it’s ID.
|
|
405
405
|
_stopTimer: function (id) {
|
|
406
|
-
var timer =
|
|
406
|
+
var timer = self._timers[id];
|
|
407
407
|
clearInterval(timer.id);
|
|
408
408
|
delete timer.id;
|
|
409
409
|
},
|
|
410
410
|
|
|
411
411
|
// Listener for `visibilitychange` event.
|
|
412
412
|
_timersStopRun: function (event) {
|
|
413
|
-
var isHidden =
|
|
414
|
-
hiddenBefore =
|
|
413
|
+
var isHidden = self.hidden(),
|
|
414
|
+
hiddenBefore = self._hiddenBefore;
|
|
415
415
|
|
|
416
416
|
if ( (isHidden && !hiddenBefore) || (!isHidden && hiddenBefore) ) {
|
|
417
|
-
for ( var i in
|
|
418
|
-
|
|
419
|
-
|
|
417
|
+
for ( var i in self._timers ) {
|
|
418
|
+
self._stopTimer(i);
|
|
419
|
+
self._runTimer(i, !isHidden);
|
|
420
420
|
}
|
|
421
421
|
}
|
|
422
422
|
}
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
return ('undefined' != typeof(variable));
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
var self = Visibility;
|
|
27
|
+
|
|
26
28
|
var timers = {
|
|
27
29
|
|
|
28
30
|
// Run callback every `interval` milliseconds if page is visible and
|
|
@@ -59,23 +61,23 @@
|
|
|
59
61
|
// checkNewMails();
|
|
60
62
|
// });
|
|
61
63
|
every: function (interval, hiddenInterval, callback) {
|
|
62
|
-
|
|
64
|
+
self._initTimers();
|
|
63
65
|
|
|
64
66
|
if ( !defined(callback) ) {
|
|
65
67
|
callback = hiddenInterval;
|
|
66
68
|
hiddenInterval = null;
|
|
67
69
|
}
|
|
68
|
-
|
|
69
|
-
var number =
|
|
70
|
-
|
|
70
|
+
self._lastTimer += 1;
|
|
71
|
+
var number = self._lastTimer;
|
|
72
|
+
self._timers[number] = ({
|
|
71
73
|
interval: interval,
|
|
72
74
|
hiddenInterval: hiddenInterval,
|
|
73
75
|
callback: callback
|
|
74
76
|
});
|
|
75
|
-
|
|
77
|
+
self._runTimer(number, false);
|
|
76
78
|
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
+
if ( self.isSupported() ) {
|
|
80
|
+
self._setListener();
|
|
79
81
|
}
|
|
80
82
|
return number;
|
|
81
83
|
},
|
|
@@ -89,12 +91,12 @@
|
|
|
89
91
|
// Visibility.stop(slideshow);
|
|
90
92
|
// });
|
|
91
93
|
stop: function(id) {
|
|
92
|
-
var timer =
|
|
94
|
+
var timer = self._timers[id]
|
|
93
95
|
if ( !defined(timer) ) {
|
|
94
96
|
return false;
|
|
95
97
|
}
|
|
96
|
-
|
|
97
|
-
delete
|
|
98
|
+
self._stopTimer(id);
|
|
99
|
+
delete self._timers[id];
|
|
98
100
|
return timer;
|
|
99
101
|
},
|
|
100
102
|
|
|
@@ -109,18 +111,18 @@
|
|
|
109
111
|
|
|
110
112
|
// Initialize variables on page loading.
|
|
111
113
|
_initTimers: function () {
|
|
112
|
-
if (
|
|
114
|
+
if ( self._timersInitialized ) {
|
|
113
115
|
return;
|
|
114
116
|
}
|
|
115
|
-
|
|
117
|
+
self._timersInitialized = true;
|
|
116
118
|
|
|
117
119
|
if ( defined(window.jQuery) && defined(jQuery.every) ) {
|
|
118
|
-
|
|
120
|
+
self._setInterval = self._chronoInterval;
|
|
119
121
|
} else {
|
|
120
|
-
|
|
122
|
+
self._setInterval = self._originalInterval;
|
|
121
123
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
self.change(function () {
|
|
125
|
+
self._timersStopRun()
|
|
124
126
|
});
|
|
125
127
|
},
|
|
126
128
|
|
|
@@ -155,8 +157,8 @@
|
|
|
155
157
|
// Argument `now` say, that timers must be execute now too.
|
|
156
158
|
_runTimer: function (id, now) {
|
|
157
159
|
var interval,
|
|
158
|
-
timer =
|
|
159
|
-
if (
|
|
160
|
+
timer = self._timers[id];
|
|
161
|
+
if ( self.hidden() ) {
|
|
160
162
|
if ( null === timer.hiddenInterval ) {
|
|
161
163
|
return;
|
|
162
164
|
}
|
|
@@ -167,25 +169,25 @@
|
|
|
167
169
|
if ( now ) {
|
|
168
170
|
timer.callback.call(window);
|
|
169
171
|
}
|
|
170
|
-
timer.id =
|
|
172
|
+
timer.id = self._setInterval(timer.callback, interval);
|
|
171
173
|
},
|
|
172
174
|
|
|
173
175
|
// Stop timer from `every` method by it’s ID.
|
|
174
176
|
_stopTimer: function (id) {
|
|
175
|
-
var timer =
|
|
177
|
+
var timer = self._timers[id];
|
|
176
178
|
clearInterval(timer.id);
|
|
177
179
|
delete timer.id;
|
|
178
180
|
},
|
|
179
181
|
|
|
180
182
|
// Listener for `visibilitychange` event.
|
|
181
183
|
_timersStopRun: function (event) {
|
|
182
|
-
var isHidden =
|
|
183
|
-
hiddenBefore =
|
|
184
|
+
var isHidden = self.hidden(),
|
|
185
|
+
hiddenBefore = self._hiddenBefore;
|
|
184
186
|
|
|
185
187
|
if ( (isHidden && !hiddenBefore) || (!isHidden && hiddenBefore) ) {
|
|
186
|
-
for ( var i in
|
|
187
|
-
|
|
188
|
-
|
|
188
|
+
for ( var i in self._timers ) {
|
|
189
|
+
self._stopTimer(i);
|
|
190
|
+
self._runTimer(i, !isHidden);
|
|
189
191
|
}
|
|
190
192
|
}
|
|
191
193
|
}
|
metadata
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: visibilityjs
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.6.1
|
|
5
4
|
prerelease:
|
|
5
|
+
version: 0.6.2
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Andrey "A.I" Sitnik
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2012-11-
|
|
12
|
+
date: 2012-11-28 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
|
+
type: :runtime
|
|
15
16
|
name: sprockets
|
|
17
|
+
prerelease: false
|
|
16
18
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
19
|
requirements:
|
|
19
20
|
- - ! '>='
|
|
20
21
|
- !ruby/object:Gem::Version
|
|
21
22
|
version: '2'
|
|
22
|
-
type: :runtime
|
|
23
|
-
prerelease: false
|
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
25
23
|
none: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
25
|
requirements:
|
|
27
26
|
- - ! '>='
|
|
28
27
|
- !ruby/object:Gem::Version
|
|
29
28
|
version: '2'
|
|
29
|
+
none: false
|
|
30
30
|
description: Visibility.js allow you to determine whether your web page is visible
|
|
31
31
|
to an user, is hidden in background tab or is prerendering. It allows you use the
|
|
32
32
|
page visibility state in JavaScript logic and improve browser performance or improve
|
|
@@ -55,17 +55,17 @@ rdoc_options: []
|
|
|
55
55
|
require_paths:
|
|
56
56
|
- lib
|
|
57
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
|
-
none: false
|
|
59
58
|
requirements:
|
|
60
59
|
- - ! '>='
|
|
61
60
|
- !ruby/object:Gem::Version
|
|
62
61
|
version: '0'
|
|
63
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
62
|
none: false
|
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
64
|
requirements:
|
|
66
65
|
- - ! '>='
|
|
67
66
|
- !ruby/object:Gem::Version
|
|
68
67
|
version: '0'
|
|
68
|
+
none: false
|
|
69
69
|
requirements: []
|
|
70
70
|
rubyforge_project:
|
|
71
71
|
rubygems_version: 1.8.23
|