|
1 | 1 | /*! BigScreen |
2 | | - * v2.0.4 - 2014-02-06 |
| 2 | + * v2.1.0 - 2014-09-30 |
3 | 3 | * https://github.com/bdougherty/BigScreen |
4 | 4 | * Copyright 2014 Brad Dougherty; Apache 2.0 License |
5 | 5 | */ |
|
28 | 28 | } |
29 | 29 | return properties; |
30 | 30 | }(); |
| 31 | + var EVENT = { |
| 32 | + ENTER: "enter", |
| 33 | + EXIT: "exit", |
| 34 | + CHANGE: "change", |
| 35 | + ERROR: "error" |
| 36 | + }; |
| 37 | + var events = []; |
| 38 | + var attachedEvents = {}; |
| 39 | + Object.keys(EVENT).forEach(function(key) { |
| 40 | + events.push(EVENT[key]); |
| 41 | + attachedEvents[EVENT[key]] = []; |
| 42 | + }); |
| 43 | + function fire() { |
| 44 | + var args = Array.prototype.slice.apply(arguments); |
| 45 | + var event = args.shift(); |
| 46 | + attachedEvents[event].forEach(function(callback) { |
| 47 | + if (typeof callback === "function") { |
| 48 | + callback.apply(callback, args); |
| 49 | + } |
| 50 | + }); |
| 51 | + } |
| 52 | + function makeListener(fn) { |
| 53 | + return function(type, handler) { |
| 54 | + if (events.indexOf(type) === -1) { |
| 55 | + return; |
| 56 | + } |
| 57 | + fn.call(this, type, handler); |
| 58 | + }; |
| 59 | + } |
31 | 60 | function _getVideo(element) { |
32 | 61 | var videoElement = null; |
33 | 62 | if (element.tagName === "VIDEO") { |
|
89 | 118 | } |
90 | 119 | var callOnEnter = function(actualElement) { |
91 | 120 | var lastElement = elements[elements.length - 1]; |
| 121 | + if (lastElement) { |
| 122 | + return; |
| 123 | + } |
92 | 124 | if ((actualElement === lastElement.element || actualElement === lastVideoElement) && lastElement.hasEntered) { |
93 | 125 | return; |
94 | 126 | } |
|
100 | 132 | } |
101 | 133 | lastElement.enter.call(lastElement.element, actualElement || lastElement.element); |
102 | 134 | lastElement.hasEntered = true; |
| 135 | + fire(EVENT.ENTER, bigscreen.element); |
103 | 136 | }; |
104 | 137 | var callOnExit = function() { |
105 | 138 | if (lastVideoElement && !hasControls && !iOS7) { |
|
111 | 144 | var element = elements.pop(); |
112 | 145 | if (element) { |
113 | 146 | element.exit.call(element.element); |
| 147 | + fire(EVENT.EXIT, element.element); |
114 | 148 | if (!bigscreen.element) { |
115 | 149 | elements.forEach(function(element) { |
116 | 150 | element.exit.call(element.element); |
| 151 | + fire(EVENT.EXIT, element.element); |
117 | 152 | }); |
118 | 153 | elements = []; |
119 | 154 | bigscreen.onexit(); |
|
126 | 161 | element = element || obj.element; |
127 | 162 | obj.error.call(element, reason); |
128 | 163 | bigscreen.onerror(element, reason); |
| 164 | + fire(EVENT.ERROR, element, reason); |
129 | 165 | } |
130 | 166 | }; |
131 | 167 | var bigscreen = { |
|
196 | 232 | } |
197 | 233 | return video.readyState < video.HAVE_METADATA ? "maybe" : video.webkitSupportsFullscreen; |
198 | 234 | }, |
| 235 | + on: makeListener(function(type, callback) { |
| 236 | + attachedEvents[type].push(callback); |
| 237 | + }), |
| 238 | + off: makeListener(function(type, callback) { |
| 239 | + var index = attachedEvents[type].indexOf(callback); |
| 240 | + if (index > -1) { |
| 241 | + attachedEvents[type].splice(index, 1); |
| 242 | + } |
| 243 | + }), |
199 | 244 | onenter: emptyFunction, |
200 | 245 | onexit: emptyFunction, |
201 | 246 | onchange: emptyFunction, |
|
232 | 277 | if (fn.change) { |
233 | 278 | document.addEventListener(fn.change, function onFullscreenChange(event) { |
234 | 279 | bigscreen.onchange(bigscreen.element); |
| 280 | + fire(EVENT.CHANGE, bigscreen.element); |
235 | 281 | if (bigscreen.element) { |
236 | 282 | var previousElement = elements[elements.length - 2]; |
237 | 283 | if (previousElement && previousElement.element === bigscreen.element) { |
|
246 | 292 | }, false); |
247 | 293 | } |
248 | 294 | document.addEventListener("webkitbeginfullscreen", function onBeginFullscreen(event) { |
249 | | - elements.push({ |
250 | | - element: event.srcElement, |
251 | | - enter: emptyFunction, |
252 | | - exit: emptyFunction, |
253 | | - error: emptyFunction |
254 | | - }); |
| 295 | + var shouldPushElement = true; |
| 296 | + if (elements.length > 0) { |
| 297 | + for (var i = 0, length = elements.length; i < length; i++) { |
| 298 | + var video = _getVideo(elements[i].element); |
| 299 | + if (video === event.srcElement) { |
| 300 | + shouldPushElement = false; |
| 301 | + break; |
| 302 | + } |
| 303 | + } |
| 304 | + } |
| 305 | + if (shouldPushElement) { |
| 306 | + elements.push({ |
| 307 | + element: event.srcElement, |
| 308 | + enter: emptyFunction, |
| 309 | + exit: emptyFunction, |
| 310 | + error: emptyFunction |
| 311 | + }); |
| 312 | + } |
255 | 313 | bigscreen.onchange(event.srcElement); |
| 314 | + fire(EVENT.CHANGE, bigscreen.srcElement); |
256 | 315 | callOnEnter(event.srcElement); |
257 | 316 | }, true); |
258 | 317 | document.addEventListener("webkitendfullscreen", function onEndFullscreen(event) { |
259 | 318 | bigscreen.onchange(event.srcElement); |
| 319 | + fire(EVENT.CHANGE, event.srcElement); |
260 | 320 | callOnExit(event.srcElement); |
261 | 321 | }, true); |
262 | 322 | if (fn.error) { |
|
0 commit comments