aboutsummaryrefslogtreecommitdiffstats
path: root/src/js/plyr.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/plyr.js')
-rw-r--r--src/js/plyr.js86
1 files changed, 45 insertions, 41 deletions
diff --git a/src/js/plyr.js b/src/js/plyr.js
index a4af9826..1cb0b199 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -390,58 +390,40 @@
return false;
}
- // Debounce
- // deBouncer by hnldesign.nl
- // based on code by Paul Irish and the original debouncing function from John Hann
- // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
- function _debounce(func, threshold, execAsap) {
- var timeout;
- return function debounced () {
- var obj = this, args = arguments;
- function delayed () {
- if (!execAsap) {
- func.apply(obj, args);
- }
- timeout = null;
- }
- if (timeout) {
- clearTimeout(timeout);
- }
- else if (execAsap) {
- func.apply(obj, args);
- }
- timeout = setTimeout(delayed, threshold || 100);
- };
- }
-
// Bind event
- function _on(element, events, callback) {
+ function _on(element, events, callback, useCapture) {
if (element) {
- _toggleListener(element, events, callback, true);
+ _toggleListener(element, events, callback, true, useCapture);
}
}
// Unbind event
- function _off(element, events, callback) {
+ function _off(element, events, callback, useCapture) {
if (element) {
- _toggleListener(element, events, callback, false);
+ _toggleListener(element, events, callback, false, useCapture);
}
}
// Bind along with custom handler
- function _proxyListener(element, eventName, userListener, defaultListener) {
+ function _proxyListener(element, eventName, userListener, defaultListener, useCapture) {
_on(element, eventName, function(event) {
if(userListener) {
userListener.apply(element, [event]);
}
defaultListener.apply(element, [event]);
- });
+ }, useCapture);
}
// Toggle event listener
- function _toggleListener(element, events, callback, toggle) {
+ function _toggleListener(element, events, callback, toggle, useCapture) {
var eventList = events.split(' ');
+ // Whether the listener is a capturing listener or not
+ // Default to false
+ if(typeof useCapture !== 'boolean') {
+ useCapture = false;
+ }
+
// If a nodelist is passed, call itself on each node
if (element instanceof NodeList) {
for (var x = 0; x < element.length; x++) {
@@ -454,7 +436,7 @@
// If a single node is passed, bind the event listener
for (var i = 0; i < eventList.length; i++) {
- element[toggle ? 'addEventListener' : 'removeEventListener'](eventList[i], callback, false);
+ element[toggle ? 'addEventListener' : 'removeEventListener'](eventList[i], callback, useCapture);
}
}
@@ -2185,16 +2167,28 @@
if (!config.hideControls || plyr.type === 'audio') {
return;
}
- var delay = false,
+ var delay = 0,
isEnterFullscreen = false,
show = toggle;
// Default to false if no boolean
if(typeof toggle !== "boolean") {
if(toggle && toggle.type) {
- delay = (toggle.type === 'mousemove');
+ // Is the enter fullscreen event
isEnterFullscreen = (toggle.type === 'enterfullscreen');
- show = _inArray(['mousemove','mouseenter'], toggle.type);
+
+ // Whether to show controls
+ show = _inArray(['mousemove', 'mouseenter', 'focus'], toggle.type);
+
+ // Delay hiding on mousemove events
+ if (toggle.type === 'mousemove') {
+ delay = 2000;
+ }
+
+ // Delay a little more for keyboard users
+ if (toggle.type === 'focus') {
+ delay = 3000;
+ }
}
else {
show = false;
@@ -2218,13 +2212,13 @@
// set the timer to hide the controls
if(!show || !plyr.media.paused) {
plyr.timers.hover = window.setTimeout(function() {
- // If the mouse is over the controls, bail
+ // If the mouse is over the controls (and not entering fullscreen), bail
if(plyr.controls.active && !isEnterFullscreen) {
return;
}
_toggleClass(plyr.container, config.classes.hideControls, true);
- }, delay ? 2000 : 0);
+ }, delay);
}
}
@@ -2446,6 +2440,7 @@
// Detect tab focus
function checkFocus() {
var focused = document.activeElement;
+
if (!focused || focused == document.body) {
focused = null;
}
@@ -2455,7 +2450,14 @@
for (var button in plyr.buttons) {
var element = plyr.buttons[button];
- _toggleClass(element, config.classes.tabFocus, (element === focused));
+ if (element instanceof NodeList) {
+ for (var i = 0; i < element.length; i++) {
+ _toggleClass(element[i], config.classes.tabFocus, (element[i] === focused));
+ }
+ }
+ else {
+ _toggleClass(element, config.classes.tabFocus, (element === focused));
+ }
}
}
_on(window, 'keyup', function(event) {
@@ -2518,14 +2520,16 @@
// Toggle controls visibility based on mouse movement
if (config.hideControls) {
- _on(plyr.container, 'mouseenter mouseleave mousemove', _toggleControls);
- //_on(plyr.container, 'mousemove', _debounce(_toggleControls, 200, true));
- _on(plyr.container, 'enterfullscreen', _toggleControls);
+ // Toggle controls on mouse events and entering fullscreen
+ _on(plyr.container, 'mouseenter mouseleave mousemove enterfullscreen', _toggleControls);
// Watch for cursor over controls so they don't hide when trying to interact
_on(plyr.controls, 'mouseenter mouseleave', function(event) {
plyr.controls.active = (event.type === 'mouseenter');
});
+
+ // Focus in/out on controls
+ _on(plyr.controls, 'focus blur', _toggleControls, true);
}
}