Fullscreen API methods (Fixes #74), onSetup callback
This commit is contained in:
		
							
								
								
									
										117
									
								
								src/js/plyr.js
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								src/js/plyr.js
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| // ========================================================================== | ||||
| // Plyr | ||||
| // plyr.js v1.1.1 | ||||
| // plyr.js v1.1.2 | ||||
| // https://github.com/selz/plyr | ||||
| // License: The MIT License (MIT) | ||||
| // ========================================================================== | ||||
| @ -80,7 +80,8 @@ | ||||
|             enabled:            true, | ||||
|             key:                "plyr_volume" | ||||
|         }, | ||||
|         controls:               ["restart", "rewind", "play", "fast-forward", "current-time", "duration", "mute", "volume", "captions", "fullscreen"] | ||||
|         controls:               ["restart", "rewind", "play", "fast-forward", "current-time", "duration", "mute", "volume", "captions", "fullscreen"], | ||||
|         onSetup:                function() {},  | ||||
|     }; | ||||
|  | ||||
|     // Build the default HTML | ||||
| @ -234,8 +235,8 @@ | ||||
|     function _browserSniff() { | ||||
|         var nAgt = navigator.userAgent, | ||||
|             name = navigator.appName, | ||||
|             fullVersion = ""+parseFloat(navigator.appVersion), | ||||
|             majorVersion = parseInt(navigator.appVersion,10), | ||||
|             fullVersion = "" + parseFloat(navigator.appVersion), | ||||
|             majorVersion = parseInt(navigator.appVersion, 10), | ||||
|             nameOffset, | ||||
|             verOffset, | ||||
|             ix; | ||||
| @ -248,46 +249,47 @@ | ||||
|         // MSIE | ||||
|         else if ((verOffset=nAgt.indexOf("MSIE")) !== -1) { | ||||
|             name = "IE"; | ||||
|             fullVersion = nAgt.substring(verOffset+5); | ||||
|             fullVersion = nAgt.substring(verOffset + 5); | ||||
|         } | ||||
|         // Chrome | ||||
|         else if ((verOffset=nAgt.indexOf("Chrome")) !== -1) { | ||||
|             name = "Chrome"; | ||||
|             fullVersion = nAgt.substring(verOffset+7); | ||||
|             fullVersion = nAgt.substring(verOffset + 7); | ||||
|         } | ||||
|         // Safari | ||||
|         else if ((verOffset=nAgt.indexOf("Safari")) !== -1) { | ||||
|             name = "Safari"; | ||||
|             fullVersion = nAgt.substring(verOffset+7); | ||||
|             fullVersion = nAgt.substring(verOffset + 7); | ||||
|             if ((verOffset=nAgt.indexOf("Version")) !== -1) { | ||||
|                 fullVersion = nAgt.substring(verOffset+8); | ||||
|                 fullVersion = nAgt.substring(verOffset + 8); | ||||
|             } | ||||
|         } | ||||
|         // Firefox | ||||
|         else if ((verOffset=nAgt.indexOf("Firefox")) !== -1) { | ||||
|             name = "Firefox"; | ||||
|             fullVersion = nAgt.substring(verOffset+8); | ||||
|             fullVersion = nAgt.substring(verOffset + 8); | ||||
|         } | ||||
|         // In most other browsers, "name/version" is at the end of userAgent  | ||||
|         else if ( (nameOffset=nAgt.lastIndexOf(" ")+1) < (verOffset=nAgt.lastIndexOf("/")) ) { | ||||
|         else if ((nameOffset=nAgt.lastIndexOf(" ") + 1) < (verOffset=nAgt.lastIndexOf("/"))) { | ||||
|             name = nAgt.substring(nameOffset,verOffset); | ||||
|             fullVersion = nAgt.substring(verOffset+1); | ||||
|             if (name.toLowerCase()==name.toUpperCase()) { | ||||
|             fullVersion = nAgt.substring(verOffset + 1); | ||||
|  | ||||
|             if (name.toLowerCase() == name.toUpperCase()) { | ||||
|                 name = navigator.appName; | ||||
|             } | ||||
|         } | ||||
|         // Trim the fullVersion string at semicolon/space if present | ||||
|         if ((ix=fullVersion.indexOf(";")) !== -1) { | ||||
|             fullVersion=fullVersion.substring(0,ix); | ||||
|         if ((ix = fullVersion.indexOf(";")) !== -1) { | ||||
|             fullVersion = fullVersion.substring(0, ix); | ||||
|         } | ||||
|         if ((ix=fullVersion.indexOf(" ")) !== -1) { | ||||
|             fullVersion=fullVersion.substring(0,ix); | ||||
|         if ((ix = fullVersion.indexOf(" ")) !== -1) { | ||||
|             fullVersion = fullVersion.substring(0, ix); | ||||
|         } | ||||
|         // Get major version | ||||
|         majorVersion = parseInt(""+fullVersion,10); | ||||
|         majorVersion = parseInt("" + fullVersion, 10); | ||||
|         if (isNaN(majorVersion)) { | ||||
|             fullVersion = ""+parseFloat(navigator.appVersion);  | ||||
|             majorVersion = parseInt(navigator.appVersion,10); | ||||
|             fullVersion = "" + parseFloat(navigator.appVersion);  | ||||
|             majorVersion = parseInt(navigator.appVersion, 10); | ||||
|         } | ||||
|  | ||||
|         // Return data | ||||
| @ -340,7 +342,7 @@ | ||||
|  | ||||
|     // Wrap an element | ||||
|     function _wrap(elements, wrapper) { | ||||
|         // Convert `elms` to an array, if necessary. | ||||
|         // Convert `elements` to an array, if necessary. | ||||
|         if (!elements.length) { | ||||
|             elements = [elements]; | ||||
|         }  | ||||
| @ -348,16 +350,16 @@ | ||||
|         // Loops backwards to prevent having to clone the wrapper on the | ||||
|         // first element (see `child` below). | ||||
|         for (var i = elements.length - 1; i >= 0; i--) { | ||||
|             var child = (i > 0) ? wrapper.cloneNode(true) : wrapper; | ||||
|             var el    = elements[i]; | ||||
|             var child   = (i > 0) ? wrapper.cloneNode(true) : wrapper; | ||||
|             var element = elements[i]; | ||||
|              | ||||
|             // Cache the current parent and sibling. | ||||
|             var parent  = el.parentNode; | ||||
|             var sibling = el.nextSibling; | ||||
|             var parent  = element.parentNode; | ||||
|             var sibling = element.nextSibling; | ||||
|              | ||||
|             // Wrap the element (is automatically removed from its current | ||||
|             // parent). | ||||
|             child.appendChild(el); | ||||
|             child.appendChild(element); | ||||
|              | ||||
|             // If the element had a sibling, insert the wrapper before | ||||
|             // the sibling to maintain the HTML structure; otherwise, just | ||||
| @ -519,7 +521,7 @@ | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Safari doesn't support the ALLOW_KEYBOARD_INPUT flag so set it to not supported | ||||
|         // Safari doesn't support the ALLOW_KEYBOARD_INPUT flag (for security) so set it to not supported | ||||
|         // https://bugs.webkit.org/show_bug.cgi?id=121496 | ||||
|         if(fullscreen.prefix === "webkit" && !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)) { | ||||
|              fullscreen.supportsFullScreen = false; | ||||
| @ -531,19 +533,16 @@ | ||||
|             // Sometimes the prefix is "ms", sometimes "MS" to keep you on your toes | ||||
|             fullscreen.fullScreenEventName = (fullscreen.prefix == "ms" ? "MSFullscreenChange" : fullscreen.prefix + "fullscreenchange"); | ||||
|  | ||||
|             fullscreen.isFullScreen = function() { | ||||
|             fullscreen.isFullScreen = function(element) { | ||||
|                 if(typeof element == "undefined") { | ||||
|                     element = document; | ||||
|                 } | ||||
|  | ||||
|                 switch (this.prefix) { | ||||
|                     case "": | ||||
|                         return document.fullScreen; | ||||
|                     case "webkit": | ||||
|                         return document.webkitIsFullScreen; | ||||
|                     case "ms": | ||||
|                         // Docs say document.msFullScreenElement returns undefined | ||||
|                         // if no element is full screem but it returns null, cheers | ||||
|                         // https://msdn.microsoft.com/en-us/library/ie/dn265028%28v=vs.85%29.aspx | ||||
|                         return (document.msFullscreenElement !== null); | ||||
|                         return document.fullscreenElement == element; | ||||
|                     default: | ||||
|                         return document[this.prefix + "FullScreen"]; | ||||
|                         return document[this.prefix + "FullscreenElement"] == element; | ||||
|                 } | ||||
|             }; | ||||
|             fullscreen.requestFullScreen = function(element) { | ||||
| @ -1035,7 +1034,7 @@ | ||||
|                 targetTime = input; | ||||
|             } | ||||
|             // Event | ||||
|             else if (typeof input === "object" && (input.type === "change" || input.type === "input")) { | ||||
|             else if (typeof input === "object" && (input.type === "input" || input.type === "change")) { | ||||
|                 // It's the seek slider | ||||
|                 // Seek to the selected time | ||||
|                 targetTime = ((input.target.value / input.target.max) * player.media.duration); | ||||
| @ -1072,17 +1071,18 @@ | ||||
|         // Toggle fullscreen | ||||
|         function _toggleFullscreen(event) { | ||||
|             // Check for native support | ||||
|             var nativeSupport = fullscreen.supportsFullScreen; | ||||
|             var nativeSupport = fullscreen.supportsFullScreen, | ||||
|                 container = player.container; | ||||
|  | ||||
|             // If it's a fullscreen change event, it's probably a native close | ||||
|             if(event && event.type === fullscreen.fullScreenEventName) { | ||||
|                 config.fullscreen.active = fullscreen.isFullScreen(); | ||||
|                 player.isFullscreen = fullscreen.isFullScreen(container); | ||||
|             } | ||||
|             // If there's native support, use it | ||||
|             else if(nativeSupport) { | ||||
|                 // Request fullscreen | ||||
|                 if(!fullscreen.isFullScreen()) { | ||||
|                     fullscreen.requestFullScreen(player.container); | ||||
|                 if(!fullscreen.isFullScreen(container)) { | ||||
|                     fullscreen.requestFullScreen(container); | ||||
|                 } | ||||
|                 // Bail from fullscreen | ||||
|                 else { | ||||
| @ -1090,14 +1090,14 @@ | ||||
|                 } | ||||
|  | ||||
|                 // Check if we're actually full screen (it could fail) | ||||
|                 config.fullscreen.active = fullscreen.isFullScreen(); | ||||
|                 player.isFullscreen = fullscreen.isFullScreen(container); | ||||
|             } | ||||
|             else { | ||||
|                 // Otherwise, it's a simple toggle | ||||
|                 config.fullscreen.active = !config.fullscreen.active; | ||||
|                 player.isFullscreen = !player.isFullscreen; | ||||
|  | ||||
|                 // Bind/unbind escape key | ||||
|                 if(config.fullscreen.active) { | ||||
|                 if(player.isFullscreen) { | ||||
|                     _on(document, "keyup", _handleEscapeFullscreen); | ||||
|                     document.body.style.overflow = "hidden"; | ||||
|                 } | ||||
| @ -1108,13 +1108,13 @@ | ||||
|             } | ||||
|  | ||||
|             // Set class hook | ||||
|             _toggleClass(player.container, config.classes.fullscreen.active, config.fullscreen.active); | ||||
|             _toggleClass(container, config.classes.fullscreen.active, player.isFullscreen); | ||||
|         } | ||||
|  | ||||
|         // Bail from faux-fullscreen  | ||||
|         function _handleEscapeFullscreen(event) { | ||||
|             // If it's a keypress and not escape, bail | ||||
|             if((event.which || event.charCode || event.keyCode) === 27 && config.fullscreen.active) { | ||||
|             if((event.which || event.charCode || event.keyCode) === 27 && player.isFullscreen) { | ||||
|                 _toggleFullscreen();                 | ||||
|             } | ||||
|         } | ||||
| @ -1391,6 +1391,9 @@ | ||||
|  | ||||
|         // Listen for events | ||||
|         function _listeners() { | ||||
|             // IE doesn't support input event, so we fallback to change | ||||
|             var inputEvent = (player.browser.name == "IE" ? "change" : "input"); | ||||
|  | ||||
|             // Play | ||||
|             _on(player.buttons.play, "click", function() {  | ||||
|                 _play();  | ||||
| @ -1412,9 +1415,11 @@ | ||||
|             // Fast forward | ||||
|             _on(player.buttons.forward, "click", _forward); | ||||
|  | ||||
|             // Get the HTML5 range input element and append audio volume adjustment on change/input | ||||
|             // IE10 doesn't support the "input" event so they have to wait for change | ||||
|             _on(player.volume, "change input", function() { | ||||
|             // Seek  | ||||
|             _on(player.buttons.seek, inputEvent, _seek); | ||||
|  | ||||
|             // Set volume | ||||
|             _on(player.volume, inputEvent, function() { | ||||
|                 _setVolume(this.value); | ||||
|             }); | ||||
|  | ||||
| @ -1440,9 +1445,6 @@ | ||||
|             // Display duration | ||||
|             _on(player.media, "loadedmetadata", _displayDuration); | ||||
|  | ||||
|             // Seek  | ||||
|             _on(player.buttons.seek, "change input", _seek); | ||||
|  | ||||
|             // Captions | ||||
|             _on(player.buttons.captions, "change", function() {  | ||||
|                 _toggleCaptions(this.checked); | ||||
| @ -1578,11 +1580,13 @@ | ||||
|             rewind:             _rewind, | ||||
|             forward:            _forward, | ||||
|             seek:               _seek, | ||||
|             source:             _parseSource, | ||||
|             poster:             _updatePoster, | ||||
|             setVolume:          _setVolume, | ||||
|             toggleMute:         _toggleMute, | ||||
|             toggleCaptions:     _toggleCaptions, | ||||
|             source:             _parseSource, | ||||
|             poster:             _updatePoster, | ||||
|             toggleFullscreen:   _toggleFullscreen, | ||||
|             isFullscreen:       function() { return player.isFullscreen || false; }, | ||||
|             support:            function(mimeType) { return _supportMime(player, mimeType); } | ||||
|         } | ||||
|     } | ||||
| @ -1646,9 +1650,12 @@ | ||||
|  | ||||
|                 // Set plyr to false if setup failed | ||||
|                 element.plyr = (Object.keys(instance).length ? instance : false); | ||||
|  | ||||
|                 // Callback | ||||
|                 config.onSetup.apply(element.plyr); | ||||
|             } | ||||
|  | ||||
|             // Add to return array | ||||
|             // Add to return array even if it's already setup | ||||
|             players.push(element.plyr); | ||||
|         } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user