visibilityjs 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,21 +1,3 @@
1
- /*
2
- * Copyright 2012 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 () {
20
2
  "use strict";
21
3
 
@@ -27,138 +9,155 @@
27
9
 
28
10
  var timers = {
29
11
 
30
- // Run callback every `interval` milliseconds if page is visible and
31
- // every `hiddenInterval` milliseconds if page is hidden.
32
- //
33
- // Visibility.every(60 * 1000, 5 * 60 * 1000, function () {
34
- // checkNewMails();
35
- // });
36
- //
37
- // You can skip `hiddenInterval` and callback will be called only if
38
- // page is visible.
39
- //
40
- // Visibility.every(1000, function () {
41
- // updateCountdown();
42
- // });
43
- //
44
- // It is analog of `setInterval(callback, interval)` but use visibility
45
- // state.
46
- //
47
- // It return timer ID, that you can use in `Visibility.stop(id)` to stop
48
- // timer (`clearInterval` analog).
49
- // Warning: timer ID is different from interval ID from `setInterval`,
50
- // so don’t use it in `clearInterval`.
51
- //
52
- // On change state from hidden to visible timers will be execute.
53
- every: function (interval, hiddenInterval, callback) {
54
- self._initTimers();
55
-
56
- if ( !defined(callback) ) {
57
- callback = hiddenInterval;
58
- hiddenInterval = null;
59
- }
60
- self._lastTimer += 1;
61
- var number = self._lastTimer;
62
- self._timers[number] = ({
63
- interval: interval,
64
- hiddenInterval: hiddenInterval,
65
- callback: callback
66
- });
67
- self._runTimer(number, false);
68
-
69
- if ( self.isSupported() ) {
70
- self._setListener();
71
- }
72
- return number;
73
- },
74
-
75
- // Stop timer from `every` method by it ID (`every` method return it).
76
- //
77
- // slideshow = Visibility.every(5 * 1000, function () {
78
- // changeSlide();
79
- // });
80
- // $('.stopSlideshow').click(function () {
81
- // Visibility.stop(slideshow);
82
- // });
83
- stop: function(id) {
84
- var timer = self._timers[id]
85
- if ( !defined(timer) ) {
86
- return false;
87
- }
88
- self._stopTimer(id);
89
- delete self._timers[id];
90
- return timer;
91
- },
92
-
93
- // Last timer number.
94
- _lastTimer: -1,
95
-
96
- // Callbacks and intervals added by `every` method.
97
- _timers: { },
98
-
99
- // Is setInterval method detected and listener is binded.
100
- _timersInitialized: false,
101
-
102
- // Initialize variables on page loading.
103
- _initTimers: function () {
104
- if ( self._timersInitialized ) {
105
- return;
106
- }
107
- self._timersInitialized = true;
108
-
109
- self.change(function () {
110
- self._timersStopRun()
111
- });
112
- },
113
-
114
- // Set interval by `setInterval`. Allow to change function for tests or
115
- // syntax sugar in `interval` arguments.
116
- _setInterval: function (callback, interval) {
117
- return setInterval(callback, interval);
118
- },
119
-
120
- // Try to run timer from every method by it’s ID. It will be use
121
- // `interval` or `hiddenInterval` depending on visibility state.
122
- // If page is hidden and `hiddenInterval` is null,
123
- // it will not run timer.
124
- //
125
- // Argument `now` say, that timers must be execute now too.
126
- _runTimer: function (id, now) {
127
- var interval,
128
- timer = self._timers[id];
129
- if ( self.hidden() ) {
130
- if ( null === timer.hiddenInterval ) {
131
- return;
132
- }
133
- interval = timer.hiddenInterval;
134
- } else {
135
- interval = timer.interval;
136
- }
137
- if ( now ) {
138
- timer.callback.call(window);
139
- }
140
- timer.id = self._setInterval(timer.callback, interval);
141
- },
142
-
143
- // Stop timer from `every` method by it’s ID.
144
- _stopTimer: function (id) {
145
- var timer = self._timers[id];
146
- clearInterval(timer.id);
147
- delete timer.id;
148
- },
149
-
150
- // Listener for `visibilitychange` event.
151
- _timersStopRun: function (event) {
152
- var isHidden = self.hidden(),
153
- hiddenBefore = self._hiddenBefore;
154
-
155
- if ( (isHidden && !hiddenBefore) || (!isHidden && hiddenBefore) ) {
156
- for ( var i in self._timers ) {
157
- self._stopTimer(i);
158
- self._runTimer(i, !isHidden);
159
- }
160
- }
161
- }
12
+ // Run callback every `interval` milliseconds if page is visible and
13
+ // every `hiddenInterval` milliseconds if page is hidden.
14
+ //
15
+ // Visibility.every(60 * 1000, 5 * 60 * 1000, function () {
16
+ // checkNewMails();
17
+ // });
18
+ //
19
+ // You can skip `hiddenInterval` and callback will be called only if
20
+ // page is visible.
21
+ //
22
+ // Visibility.every(1000, function () {
23
+ // updateCountdown();
24
+ // });
25
+ //
26
+ // It is analog of `setInterval(callback, interval)` but use visibility
27
+ // state.
28
+ //
29
+ // It return timer ID, that you can use in `Visibility.stop(id)` to stop
30
+ // timer (`clearInterval` analog).
31
+ // Warning: timer ID is different from interval ID from `setInterval`,
32
+ // so don’t use it in `clearInterval`.
33
+ //
34
+ // On change state from hidden to visible timers will be execute.
35
+ every: function (interval, hiddenInterval, callback) {
36
+ self._time();
37
+
38
+ if ( !defined(callback) ) {
39
+ callback = hiddenInterval;
40
+ hiddenInterval = null;
41
+ }
42
+
43
+ self._lastTimer += 1;
44
+ var number = self._lastTimer;
45
+
46
+ self._timers[number] = {
47
+ visible: interval,
48
+ hidden: hiddenInterval,
49
+ callback: callback
50
+ };
51
+ self._run(number, false);
52
+
53
+ if ( self.isSupported() ) {
54
+ self._listen();
55
+ }
56
+ return number;
57
+ },
58
+
59
+ // Stop timer from `every` method by it ID (`every` method return it).
60
+ //
61
+ // slideshow = Visibility.every(5 * 1000, function () {
62
+ // changeSlide();
63
+ // });
64
+ // $('.stopSlideshow').click(function () {
65
+ // Visibility.stop(slideshow);
66
+ // });
67
+ stop: function(id) {
68
+ var timer = self._timers[id]
69
+ if ( !defined(timer) ) {
70
+ return false;
71
+ }
72
+ self._stop(id);
73
+ delete self._timers[id];
74
+ return timer;
75
+ },
76
+
77
+ // Last timer number.
78
+ _lastTimer: -1,
79
+
80
+ // Callbacks and intervals added by `every` method.
81
+ _timers: { },
82
+
83
+ // Is setInterval method detected and listener is binded.
84
+ _timed: false,
85
+
86
+ // Initialize variables on page loading.
87
+ _time: function () {
88
+ if ( self._timed ) {
89
+ return;
90
+ }
91
+ self._timed = true;
92
+
93
+ self.change(function () {
94
+ self._stopRun()
95
+ });
96
+ },
97
+
98
+ // Try to run timer from every method by it’s ID. It will be use
99
+ // `interval` or `hiddenInterval` depending on visibility state.
100
+ // If page is hidden and `hiddenInterval` is null,
101
+ // it will not run timer.
102
+ //
103
+ // Argument `runNow` say, that timers must be execute now too.
104
+ _run: function (id, runNow) {
105
+ var interval,
106
+ timer = self._timers[id];
107
+ if ( self.hidden() ) {
108
+ if ( null === timer.hidden ) {
109
+ return;
110
+ }
111
+ interval = timer.hidden;
112
+ } else {
113
+ interval = timer.visible;
114
+ }
115
+
116
+ var runner = function () {
117
+ timer.last = new Date();
118
+ timer.callback.call(window);
119
+ }
120
+
121
+ if ( runNow ) {
122
+ var now = new Date();
123
+ var last = now - timer.last ;
124
+
125
+ if ( interval > last ) {
126
+ timer.delay = setTimeout(function () {
127
+ runner();
128
+ timer.id = setInterval(runner, interval);
129
+ }, interval - last);
130
+ } else {
131
+ runner();
132
+ timer.id = setInterval(runner, interval);
133
+ }
134
+
135
+ } else {
136
+ timer.id = setInterval(runner, interval);
137
+ }
138
+ },
139
+
140
+ // Stop timer from `every` method by it’s ID.
141
+ _stop: function (id) {
142
+ var timer = self._timers[id];
143
+ clearInterval(timer.id);
144
+ clearTimeout(timer.delay);
145
+ delete timer.id;
146
+ delete timer.delay;
147
+ },
148
+
149
+ // Listener for `visibilitychange` event.
150
+ _stopRun: function (event) {
151
+ var isHidden = self.hidden(),
152
+ wasHidden = self._wasHidden;
153
+
154
+ if ( (isHidden && !wasHidden) || (!isHidden && wasHidden) ) {
155
+ for ( var i in self._timers ) {
156
+ self._stop(i);
157
+ self._run(i, !isHidden);
158
+ }
159
+ }
160
+ }
162
161
 
163
162
  };
164
163
 
metadata CHANGED
@@ -1,75 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: visibilityjs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
- - Andrey "A.I" Sitnik
7
+ - Andrey Sitnik
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-13 00:00:00.000000000 Z
11
+ date: 2014-01-06 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sprockets
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '2'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '2'
30
27
  description: Visibility.js allow you to determine whether your web page is visible
31
28
  to an user, is hidden in background tab or is prerendering. It allows you use the
32
29
  page visibility state in JavaScript logic and improve browser performance or improve
33
30
  user interface experience.
34
- email:
35
- - andrey@sitnik.ru
31
+ email: andrey@sitnik.ru
36
32
  executables: []
37
33
  extensions: []
38
34
  extra_rdoc_files:
39
35
  - LICENSE
40
36
  - README.md
41
- - ChangeLog
37
+ - ChangeLog.md
42
38
  files:
43
- - lib/assets/javascripts/visibility.js
39
+ - ChangeLog.md
40
+ - LICENSE
41
+ - README.md
44
42
  - lib/assets/javascripts/visibility.core.js
45
- - lib/assets/javascripts/visibility.timers.js
46
43
  - lib/assets/javascripts/visibility.fallback.js
44
+ - lib/assets/javascripts/visibility.js
45
+ - lib/assets/javascripts/visibility.timers.js
47
46
  - lib/visibilityjs.rb
48
- - LICENSE
49
- - README.md
50
- - ChangeLog
51
47
  homepage: https://github.com/ai/visibility.js
52
- licenses: []
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
53
51
  post_install_message:
54
52
  rdoc_options: []
55
53
  require_paths:
56
54
  - lib
57
55
  required_ruby_version: !ruby/object:Gem::Requirement
58
- none: false
59
56
  requirements:
60
- - - ! '>='
57
+ - - ">="
61
58
  - !ruby/object:Gem::Version
62
59
  version: '0'
63
60
  required_rubygems_version: !ruby/object:Gem::Requirement
64
- none: false
65
61
  requirements:
66
- - - ! '>='
62
+ - - ">="
67
63
  - !ruby/object:Gem::Version
68
64
  version: '0'
69
65
  requirements: []
70
66
  rubyforge_project:
71
- rubygems_version: 1.8.23
67
+ rubygems_version: 2.2.0
72
68
  signing_key:
73
- specification_version: 3
69
+ specification_version: 4
74
70
  summary: Visibility.js - a wrapper for the Page Visibility API.
75
71
  test_files: []