Cleanup events and references

This commit is contained in:
Sam Potts
2017-04-16 13:00:57 +10:00
parent 546cdaad92
commit ff2d27f8e5
3 changed files with 181 additions and 107 deletions

View File

@ -21,7 +21,17 @@
captions: {
defaultActive: true
},
controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'fullscreen']
controls: [
'play-large',
'play',
'progress',
'current-time',
'mute',
'volume',
'captions',
'settings',
'fullscreen'
]
});
plyr.loadSprite('dist/demo.svg');

4
dist/plyr.js vendored

File diff suppressed because one or more lines are too long

View File

@ -89,15 +89,15 @@
rewind: '[data-plyr="rewind"]',
forward: '[data-plyr="fast-forward"]',
mute: '[data-plyr="mute"]',
captions: '[data-plyr="captions"]',
fullscreen: '[data-plyr="fullscreen"]',
settings: '[data-plyr="settings"]',
pip: '[data-plyr="pip"]',
airplay: '[data-plyr="airplay"]',
settings: '[data-plyr="settings"]',
speed: '[data-plyr="speed"]',
loop: '[data-plyr="loop"]',
captions: '[data-plyr="captions"]',
//captions_menu: '[data-plyr="captions_menu"]',
//captions_lang: '[data-plyr="captions_lang"]',
language: '[data-plyr="language"]',
quality: '[data-plyr="quality"]'
},
inputs: {
seek: '[data-plyr="seek"]',
@ -160,7 +160,19 @@
enabled: true,
key: 'plyr'
},
controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
controls: [
'play-large',
'play',
'progress',
'current-time',
'mute',
'volume',
'captions',
'settings',
'pip',
'airplay',
'fullscreen'
],
i18n: {
restart: 'Restart',
rewind: 'Rewind {seektime} secs',
@ -214,10 +226,13 @@
mute: null,
volume: null,
captions: null,
//captions_lang: null,
fullscreen: null,
pip: null,
airplay: null,
speed: null,
loop: null
quality: null,
loop: null,
language: null
},
// Events to watch on HTML5 media elements
events: [
@ -272,7 +287,7 @@
return input !== null && typeof input === 'function';
},
event: function(input) {
return input !== null && typeof input === 'object' && (input.constructor === Event || input.constructor === CustomEvent);
return input !== null && input instanceof Event;
},
undefined: function(input) {
return input !== null && typeof input === 'undefined';
@ -581,10 +596,10 @@
}
// Bind along with custom handler
function proxy(element, eventName, userListener, defaultListener, useCapture) {
function proxy(element, eventName, customListener, defaultListener, useCapture) {
on(element, eventName, function(event) {
if (userListener) {
userListener.apply(element, [event]);
if (customListener) {
customListener.apply(element, [event]);
}
defaultListener.apply(element, [event]);
}, useCapture);
@ -909,8 +924,9 @@
progress: {},
inputs: {},
settings: {
tabs: {},
panes: {}
menu: null,
panes: {},
tabs: {}
},
media: media
};
@ -1265,6 +1281,7 @@
}, '00:00');
container.appendChild(tooltip);
player.elements.display.seekTooltip = tooltip;
}
player.elements.progress = container;
@ -1318,11 +1335,11 @@
// Settings button / menu
if (inArray(config.controls, 'settings')) {
var wrapper = createElement('span', extend(getAttributesFromSelector(config.selectors.buttons.settings), {
var menu = createElement('span', extend(getAttributesFromSelector(config.selectors.buttons.settings), {
class: 'plyr__menu'
}));
wrapper.appendChild(createButton('settings', {
menu.appendChild(createButton('settings', {
id: 'plyr-settings-toggle-' + data.id,
'aria-haspopup': true,
'aria-controls': 'plyr-settings-' + data.id,
@ -1378,6 +1395,8 @@
tab.appendChild(button);
tabs.appendChild(tab);
player.elements.settings.tabs[type] = tab;
});
home.appendChild(tabs);
@ -1435,13 +1454,17 @@
pane.appendChild(options);
inner.appendChild(pane);
player.elements.settings.panes[type] = pane;
});
form.appendChild(inner);
wrapper.appendChild(form);
menu.appendChild(form);
controls.appendChild(wrapper);
controls.appendChild(menu);
player.elements.settings.menu = menu;
/*html.push(
'<div class="plyr__menu" data-plyr="settings">',
@ -1732,7 +1755,7 @@
'</li>'
].join(''));
getElement(config.selectors.menu.quality).innerHTML = list.join('');
player.elements.settings.panes.quality.innerHTML = list.join('');
}
}
@ -2549,7 +2572,8 @@
// Get the instance
var instance = event.target;
var quality = player.getPlaybackQuality();
// Get current quality
var quality = instance.getPlaybackQuality();
// var set = player.setPlaybackQuality();
console.warn(quality);
@ -2560,30 +2584,30 @@
// Create a faux HTML5 API using the YouTube API
player.elements.media.play = function() {
player.playVideo();
instance.playVideo();
player.elements.media.paused = false;
};
player.elements.media.pause = function() {
player.pauseVideo();
instance.pauseVideo();
player.elements.media.paused = true;
};
player.elements.media.stop = function() {
player.stopVideo();
instance.stopVideo();
player.elements.media.paused = true;
};
player.elements.media.duration = player.getDuration();
player.elements.media.duration = instance.getDuration();
player.elements.media.paused = true;
player.elements.media.currentTime = 0;
player.elements.media.muted = player.isMuted();
player.elements.media.muted = instance.isMuted();
// Get available speeds
var speed = player.getPlaybackRate();
var speedOptions = player.getAvailablePlaybackRates();
//var set = player.setPlaybackRate();
var speed = instance.getPlaybackRate();
var speedOptions = instance.getAvailablePlaybackRates();
//var set = instance.setPlaybackRate();
console.warn(speed, speedOptions);
// Set title
config.title = player.getVideoData().title;
config.title = instance.getVideoData().title;
// Set the tabindex
if (player.supported.full) {
@ -2605,7 +2629,7 @@
// Setup buffering
timers.buffering = window.setInterval(function() {
// Get loaded % from YouTube
player.elements.media.buffered = player.getVideoLoadedFraction();
player.elements.media.buffered = instance.getVideoLoadedFraction();
// Trigger progress only when we actually buffer something
if (player.elements.media.lastBuffered === null || player.elements.media.lastBuffered < player.elements.media.buffered) {
@ -2659,7 +2683,7 @@
// Poll to get playback progress
timers.playing = window.setInterval(function() {
// Set the current time
player.elements.media.currentTime = player.getCurrentTime();
player.elements.media.currentTime = instance.getCurrentTime();
// Trigger timeupdate
trigger(player.elements.media, 'timeupdate');
@ -2668,14 +2692,14 @@
// Check duration again due to YouTube bug
// https://github.com/Selz/plyr/issues/374
// https://code.google.com/p/gdata-issues/issues/detail?id=8690
if (player.elements.media.duration !== player.getDuration()) {
player.elements.media.duration = player.getDuration();
if (player.elements.media.duration !== instance.getDuration()) {
player.elements.media.duration = instance.getDuration();
trigger(player.elements.media, 'durationchange');
}
// Get quality
var qualityOptions = player.getAvailableQualityLevels();
var quality = player.getPlaybackQuality();
var qualityOptions = instance.getAvailableQualityLevels();
var quality = instance.getPlaybackQuality();
setQualityMenu(qualityOptions, quality);
break;
@ -2975,7 +2999,7 @@
}
}
// Speed-up
// Set playback speed
function setSpeed(speed) {
// Load speed from storage or default value
if (is.undefined(speed)) {
@ -3042,9 +3066,9 @@
// Seek to time
// The input parameter can be an event or a number
function seek(input) {
var targetTime = 0,
paused = player.elements.media.paused,
duration = getDuration();
var targetTime = 0;
var paused = player.elements.media.paused;
var duration = getDuration();
if (is.number(input)) {
targetTime = input;
@ -3244,6 +3268,11 @@
var max = 10;
var min = 0;
// If volume is event, get from input
if (is.event(volume)) {
volume = volume.target.value;
}
// Load volume from storage if no value specified
if (is.undefined(volume)) {
volume = player.storage.volume;
@ -3476,7 +3505,7 @@
mins = ('0' + mins).slice(-2);
// Generate display
var label = (displayHours ? hours + ':' : '') + mins + ':' + secs;
var display = (displayHours ? hours + ':' : '') + mins + ':' + secs;
// Render
element.textContent = display;
@ -3548,24 +3577,24 @@
var duration = getDuration();
// Bail if setting not true
if (!config.tooltips.seek || !player.elements.progress.container || duration === 0) {
if (!config.tooltips.seek || !is.htmlElement(player.elements.inputs.seek) || !is.htmlElement(player.elements.display.seekTooltip) || duration === 0) {
return;
}
// Calculate percentage
var clientRect = player.elements.progress.container.getBoundingClientRect(),
percent = 0,
visible = config.classes.tooltip + '--visible';
var clientRect = player.elements.inputs.seek.getBoundingClientRect();
var percent = 0;
var visible = config.classes.tooltip + '--visible';
// Determine percentage, if already visible
if (!event) {
if (is.event(event)) {
percent = ((100 / clientRect.width) * (event.pageX - clientRect.left));
} else {
if (hasClass(player.elements.display.seekTooltip, visible)) {
percent = player.elements.display.seekTooltip.style.left.replace('%', '');
} else {
return;
}
} else {
percent = ((100 / clientRect.width) * (event.pageX - clientRect.left));
}
// Set bounds
@ -3583,7 +3612,7 @@
// Show/hide the tooltip
// If the event is a moues in/out and percentage is inside bounds
if (event && inArray(['mouseenter', 'mouseleave'], event.type)) {
if (is.event(event) && inArray(['mouseenter', 'mouseleave'], event.type)) {
toggleClass(player.elements.display.seekTooltip, visible, (event.type === 'mouseenter'));
}
}
@ -3595,10 +3624,10 @@
return;
}
var delay = 0,
isEnterFullscreen = false,
show = toggle,
loading = hasClass(player.elements.container, config.classes.loading);
var delay = 0;
var isEnterFullscreen = false;
var show = toggle;
var loading = hasClass(player.elements.container, config.classes.loading);
// Default to false if no boolean
if (!is.boolean(toggle)) {
@ -4072,8 +4101,8 @@
// Focus/tab management
on(window, 'keyup', function(event) {
var code = getKeyCode(event),
focused = getFocusElement();
var code = getKeyCode(event);
var focused = getFocusElement();
if (code === 9) {
checkTabFocus(focused);
@ -4090,6 +4119,16 @@
});
}
// Trigger custom and default handlers
var handlerProxy = function(event, customHandler, defaultHandler) {
if (is.function(customHandler)) {
customHandler.call(this, event);
}
if (is.function(defaultHandler)) {
defaultHandler.call(this, event);
}
}
// Play
proxy(player.elements.buttons.play, 'click', config.listeners.play, _togglePlay);
proxy(player.elements.buttons.playLarge, 'click', config.listeners.play, _togglePlay);
@ -4097,61 +4136,33 @@
// Pause
proxy(player.elements.buttons.pause, 'click', config.listeners.pause, _togglePlay);
// Restart
// Pause
proxy(player.elements.buttons.restart, 'click', config.listeners.restart, seek);
// Rewind
proxy(player.elements.buttons.rewind, 'click', config.listeners.rewind, rewind);
// Fast forward
// Rewind
proxy(player.elements.buttons.forward, 'click', config.listeners.forward, forward);
// Speed-up
proxy(player.elements.buttons.speed, 'click', config.listeners.speed, function() {
//var speedValue = document.querySelector('[data-plyr="speed"]:checked').value;
//setSpeed(Number(speedValue));
});
// Seek
proxy(player.elements.inputs.seek, inputEvent, config.listeners.seek, seek);
// Set volume
proxy(player.elements.inputs.volume, inputEvent, config.listeners.volume, function() {
setVolume(player.elements.inputs.volume.value);
});
// Mute
proxy(player.elements.buttons.mute, 'click', config.listeners.mute, toggleMute);
// Captions
proxy(player.elements.buttons.captions, 'click', config.listeners.captions, toggleCaptions);
// Fullscreen
proxy(player.elements.buttons.fullscreen, 'click', config.listeners.fullscreen, toggleFullscreen);
// Looping
proxy(player.elements.buttons.loop, 'click', config.listeners.loop, function(event) {
var value = event.target.getAttribute('data-loop__value') || event.target.getAttribute('data-loop__type');
if (inArray(['start', 'end', 'all', 'none'], value)) {
toggleLoop(value);
}
// Picture-in-Picture
proxy(player.elements.buttons.pip, 'click', config.listeners.pip, function(event) {
// TODO: Check support here
player.elements.media.webkitSetPresentationMode(player.elements.media.webkitPresentationMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture');
});
// Handle user exiting fullscreen by escaping etc
if (support.fullscreen) {
on(document, fullscreen.eventType, toggleFullscreen);
}
// Captions
proxy(player.elements.buttons.captions, 'click', config.listeners.captions, toggleCaptions);
// TODO: ??
// on(player.elements.buttons.captions_menu, 'click', toggleCaptions);
// Language
proxy(player.elements.buttons.lang, 'click', config.listeners.lang, function(e) {
var langIndex = e.target.attributes.getNamedItem("data-index").value;
setCaptionIndex(langIndex);
});
// Settings
on(player.elements.buttons.settings, 'click', function(event) {
// Settings menu
on(player.elements.settings.menu, 'click', function(event) {
// Settings menu
var menu = this;
var toggle = event.target;
var target = document.getElementById(toggle.getAttribute('aria-controls'));
@ -4210,14 +4221,53 @@
}
});
// Picture in picture
on(player.elements.buttons.pip, 'click', function() {
// TODO: Check support here
player.elements.media.webkitSetPresentationMode(player.elements.media.webkitPresentationMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture');
// Settings menu items - use event delegation as items are added/removed
on(player.elements.settings.menu, 'click', function(event) {
// Settings - Speed
if (matches(event.target, config.selectors.buttons.speed)) {
handlerProxy.call(this, event, config.listeners.speed, function() {
//var speedValue = document.querySelector('[data-plyr="speed"]:checked').value;
//setSpeed(Number(speedValue));
});
}
// Settings - Quality
else if (matches(event.target, config.selectors.buttons.quality)) {
handlerProxy.call(this, event, config.listeners.quality, function() {
console.warn("Set quality");
});
}
// Settings - Looping
else if (matches(event.target, config.selectors.buttons.loop)) {
handlerProxy.call(this, event, config.listeners.loop, function() {
// TODO: This should be done in the method itself I think
var value = event.target.getAttribute('data-loop__value') || event.target.getAttribute('data-loop__type');
if (inArray(['start', 'end', 'all', 'none'], value)) {
toggleLoop(value);
}
});
}
// Settings - Language
else if (matches(event.target, config.selectors.buttons.language)) {
handlerProxy.call(this, event, config.listeners.language, function(event) {
// TODO: This should be done in the method itself I think
var index = event.target.attributes.getNamedItem("data-index").value;
setCaptionIndex(index);
});
}
});
// Seek
proxy(player.elements.inputs.seek, inputEvent, config.listeners.seek, seek);
// Seek
proxy(player.elements.inputs.volume, inputEvent, config.listeners.volume, setVolume);
// Seek tooltip
on(player.elements.progress.container, 'mouseenter mouseleave mousemove', updateSeekTooltip);
on(player.elements.progress, 'mouseenter mouseleave mousemove', updateSeekTooltip);
// Toggle controls visibility based on mouse movement
if (config.hideControls) {
@ -4238,21 +4288,22 @@
on(player.elements.controls, 'focus blur', toggleControls, true);
}
// Adjust volume on scroll
on(player.elements.inputs.volume, 'wheel', function(event) {
event.preventDefault();
// Mouse wheel for volume
proxy(player.elements.inputs.volume, 'wheel', config.listeners.volume, function(event) {
// Detect "natural" scroll - suppored on OS X Safari only
// Other browsers on OS X will be inverted until support improves
var inverted = event.webkitDirectionInvertedFromDevice,
step = (1 / 5);
var inverted = event.webkitDirectionInvertedFromDevice;
var step = (1 / 5);
var direction = 0;
// Scroll down (or up on natural) to decrease
if (event.deltaY < 0 || event.deltaX > 0) {
if (inverted) {
decreaseVolume(step);
direction = -1;
} else {
increaseVolume(step);
direction = 1;
}
}
@ -4260,11 +4311,24 @@
if (event.deltaY > 0 || event.deltaX < 0) {
if (inverted) {
increaseVolume(step);
direction = 1;
} else {
decreaseVolume(step);
direction = -1;
}
}
// Don't break page scrolling at max and min
if ((direction === 1 && player.elements.media.volume < 1) ||
(direction === -1 && player.elements.media.volume > 0)) {
event.preventDefault();
}
});
// Handle user exiting fullscreen by escaping etc
if (support.fullscreen) {
on(document, fullscreen.eventType, toggleFullscreen);
}
}
// Listen for media events