Loading tweaks, Microsoft Edge tweaks

This commit is contained in:
Sam Potts 2016-08-21 19:25:21 +10:00
parent aac0a5a3a9
commit a8062354ec
9 changed files with 95 additions and 124 deletions

View File

@ -20,12 +20,12 @@ And some other changes and bug fixes:
- `on()` to provide an easy way to listen to events - `on()` to provide an easy way to listen to events
- `stop()` to, you guessed it, stop the player - `stop()` to, you guessed it, stop the player
- `destroy()` now works correctly for YouTube and Vimeo (fixes #272) - `destroy()` now works correctly for YouTube and Vimeo (fixes #272)
- New `destroyed` event when original element is restored (original element passed as event target) - New `destroyed` event when `destroy()` has completed (original element is passed as event.target)
- Default volume is now 10 (max) rather than 5 - Default volume is now 10 (max) rather than 5
- Sprite is only loaded once (fixes #259) - Sprite is only loaded once (fixes #259)
- Fixes for Vimeo post message bugs on source change or destroy (fixes #318) - Fixes for Vimeo post message bugs on source change or destroy (fixes #318)
- Save caption state in storage (fixes #311) - Save caption state in storage (fixes #311)
- Added keyboard shortcuts to the current focused player (with option to disable) (fixes #309) - Added keyboard shortcuts to the current focused player (with `keyboardShortcuts` boolean option to disable) (fixes #309)
- Fix for captions bug (fixes #332) - Fix for captions bug (fixes #332)
- Change to AMD (fixes #298) - Change to AMD (fixes #298)

2
demo/dist/demo.css vendored

File diff suppressed because one or more lines are too long

View File

@ -73,8 +73,8 @@
</main> </main>
<!-- Plyr core script --> <!-- Plyr core script -->
<!--<script src="../dist/plyr.js"></script>--> <script src="../dist/plyr.js"></script>
<script src="../src/js/plyr.js"></script> <!--<script src="../src/js/plyr.js"></script>-->
<!-- Docs script --> <!-- Docs script -->
<script src="dist/demo.js"></script> <script src="dist/demo.js"></script>

2
dist/plyr.css vendored

File diff suppressed because one or more lines are too long

4
dist/plyr.js vendored

File diff suppressed because one or more lines are too long

View File

@ -13,16 +13,16 @@ We wanted a lightweight, accessible and customizable media player that supports
- **Lightweight** - under 10KB minified and gzipped - **Lightweight** - under 10KB minified and gzipped
- **[Customisable](#html)** - make the player look how you want with the markup you want - **[Customisable](#html)** - make the player look how you want with the markup you want
- **Semantic** - uses the *right* elements. `<input type="range">` for volume and `<progress>` for progress and well, `<button>`s for buttons. There's no `<span>` or `<a href="#">` button hacks - **Semantic** - uses the *right* elements. `<input type="range">` for volume and `<progress>` for progress and well, `<button>`s for buttons. There's no `<span>` or `<a href="#">` button hacks
- **Responsive** - as you'd expect these days - **Responsive** - works with any screen size
- **HTML Video & Audio** - support for both formats - **HTML Video & Audio** - support for both formats
- **[Embedded Video](#embeds)** - support for YouTube and Vimeo video playback - **[Embedded Video](#embeds)** - support for YouTube and Vimeo video playback
- **[Streaming](#streaming)** - support for hls.js, Shaka and dash.js streaming playback
- **[API](#api)** - toggle playback, volume, seeking, and more - **[API](#api)** - toggle playback, volume, seeking, and more
- **[Universal events](#events)** - no messing around with Vimeo and YouTube APIs, all events are universal across formats - **[Events](#events)** - no messing around with Vimeo and YouTube APIs, all events are standardized across formats
- **[Fullscreen](#fullscreen)** - supports native fullscreen with fallback to "full window" modes - **[Fullscreen](#fullscreen)** - supports native fullscreen with fallback to "full window" modes
- **i18n support** - support for internationalization of controls - **i18n support** - support for internationalization of controls
- **No dependencies** - written in "vanilla" JavaScript, no jQuery required - **No dependencies** - written in "vanilla" JavaScript, no jQuery required
- **SASS and LESS source** - to include in your build process - **SASS and LESS** - to include in your build processes
- **[Streaming](#streaming)** - support for hls.js, Shaka and dash.js streaming playback
Oh and yes, it works with Bootstrap. Oh and yes, it works with Bootstrap.
@ -78,7 +78,7 @@ More info is on [npm](https://www.npmjs.com/package/ember-cli-plyr) and [GitHub]
Here's a quick run through on getting up and running. Here's a quick run through on getting up and running.
### HTML ### HTML
Plyr extends upon the standard HTML5 markup so that's all you need for those types. Plyr extends upon the standard HTML5 markup so that's all you need for those types. More info on advanced HTML markup can be found under [initialising](#initialising).
#### HTML5 Video #### HTML5 Video
```html ```html
@ -172,7 +172,7 @@ WebVTT captions are supported. To add a caption track, check the HTML example ab
#### Initialising #### Initialising
By default, Plyr looks for all `<video>`, `<audio>` and `[data-type]` elements with the document and initialises on any found. You can specify other options, including a different NodeList, HTMLElement, Array of HTMLElements or string selector as below: By default, `setup()` will find all `<video>`, `<audio>` and `[data-type]` elements with the document and initialises on any found. Each target media element found will be wrapped in a `<div>` for styling and setup individually. You can specify a variety of arguments to `setup()` to use, including a different NodeList, HTMLElement, Array of HTMLElements or string selector as below:
Passing a [NodeList](https://developer.mozilla.org/en-US/docs/Web/API/NodeList): Passing a [NodeList](https://developer.mozilla.org/en-US/docs/Web/API/NodeList):
```javascript ```javascript
@ -197,14 +197,14 @@ Passing a [string selector](https://developer.mozilla.org/en-US/docs/Web/API/Doc
plyr.setup('.js-player', options); plyr.setup('.js-player', options);
``` ```
The NodeList, HTMLElement or string selector can be the target `<video>`, `<audio>` or `[data-type]` (for embeds) element or a container element. If a container has several media elements inside, each media element will be wrapped in a `<div>` and setup individually. The NodeList, HTMLElement or string selector can be the target `<video>`, `<audio>` or `[data-type]` (for embeds) element itself or a container element.
Passing just the options object: Passing just the options object:
```javascript ```javascript
plyr.setup(options); plyr.setup(options);
``` ```
`setup()` will return an array of instances that can be used with the [#API](API) methods. See the [#API](API) section for more. `setup()` will return an array of *instances* that can be used with the [API](#api) methods. See the [API](#api) section for more info.
#### RangeTouch #### RangeTouch
Some touch browsers (particularly Mobile Safari on iOS) seem to have issues with `<input type="range">` elements whereby touching the track to set the value doesn't work and sliding the thumb can be tricky. To combat this, I've created [RangeTouch](https://rangetouch.com) which I'd recommend including in your solution. It's a tiny script with a nice benefit for users on touch devices. Some touch browsers (particularly Mobile Safari on iOS) seem to have issues with `<input type="range">` elements whereby touching the track to set the value doesn't work and sliding the thumb can be tricky. To combat this, I've created [RangeTouch](https://rangetouch.com) which I'd recommend including in your solution. It's a tiny script with a nice benefit for users on touch devices.
@ -476,7 +476,7 @@ Here's a list of the methods supported:
<tr> <tr>
<td><code>getEmbed()</code></td> <td><code>getEmbed()</code></td>
<td>&mdash;</td> <td>&mdash;</td>
<td>Get the embed API to access those methods - either YouTube or Vimeo.</td> <td>Get the [embed](#embed) API to access those methods - either YouTube or Vimeo.</td>
</tr> </tr>
<tr> <tr>
<td><code>getType()</code></td> <td><code>getType()</code></td>
@ -486,12 +486,12 @@ Here's a list of the methods supported:
<tr> <tr>
<td><code>isReady()</code></td> <td><code>isReady()</code></td>
<td>&mdash;</td> <td>&mdash;</td>
<td>Determine if the player is ready to accept API calls - this is because HTML5 is ready instantly but YouTube and Vimeo can take some time to load their APIs.</td> <td>Determine if the player is loaded and UI ready - this is because HTML5 is ready instantly but YouTube and Vimeo can take some time to load their APIs.</td>
</tr> </tr>
<tr> <tr>
<td><code>on()</code></td> <td><code>on()</code></td>
<td>String, Function</td> <td>String, Function</td>
<td>Watch for an event (first argument) and run a callback function (second argument). This saves you doing your own <code>addEventListner</code>s.</td> <td>Watch for an event (first argument) and run a callback function (second argument). This saves you doing your own <code>addEventListner</code> code.</td>
</tr> </tr>
<tr> <tr>
<td><code>play()</code></td> <td><code>play()</code></td>
@ -587,7 +587,7 @@ Here's a list of the methods supported:
<tr> <tr>
<td><code>destroy()</code></td> <td><code>destroy()</code></td>
<td>&mdash;</td> <td>&mdash;</td>
<td>Destroys the plyr UI and any media event listeners, effectively restoring to the previous state before <code>setup()</code> was called.</td> <td>Restores the original element, reversing the effects of <code>setup()</code>.</td>
</tr> </tr>
<tr> <tr>
<td><code>getCurrentTime()</code></td> <td><code>getCurrentTime()</code></td>
@ -687,7 +687,7 @@ Some more details on the object parameters
<tr> <tr>
<td><code>title</code></td> <td><code>title</code></td>
<td>String</td> <td>String</td>
<td>Title of the new media. Used for the aria labelling.</td> <td>Title of the new media. Used for the `aria-label` attribute on the play button, and outer container.</td>
</tr> </tr>
<tr> <tr>
<td><code>sources</code></td> <td><code>sources</code></td>
@ -850,7 +850,7 @@ These events also bubble up the DOM. The event target will be the container elem
<tr> <tr>
<td><code>destroyed</code></td> <td><code>destroyed</code></td>
<td></td> <td></td>
<td>When an instance is destroyed. The original element that replaced the container will be the event target.</td> <td>When an instance is destroyed. The original element that replaced the container will be returned to your handler as the event target.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -616,7 +616,7 @@
element: null, element: null,
prefix: '' prefix: ''
}, },
browserPrefixes = 'webkit moz o ms khtml'.split(' '); browserPrefixes = 'webkit o ms khtml'.split(' ');
// Check for native support // Check for native support
if (!_is.undefined(document.cancelFullScreen)) { if (!_is.undefined(document.cancelFullScreen)) {
@ -653,8 +653,6 @@
switch (this.prefix) { switch (this.prefix) {
case '': case '':
return document.fullscreenElement === element; return document.fullscreenElement === element;
case 'moz':
return document.mozFullScreenElement === element;
default: default:
return document[this.prefix + 'FullscreenElement'] === element; return document[this.prefix + 'FullscreenElement'] === element;
} }
@ -1657,7 +1655,7 @@
}, },
events: { events: {
'onError': function(event) { 'onError': function(event) {
_triggerEvent(container, 'error', true, { _triggerEvent(plyr.container, 'error', true, {
code: event.data, code: event.data,
embed: event.target embed: event.target
}); });
@ -1681,7 +1679,7 @@
}; };
plyr.media.duration = instance.getDuration(); plyr.media.duration = instance.getDuration();
plyr.media.paused = true; plyr.media.paused = true;
plyr.media.currentTime = instance.getCurrentTime(); plyr.media.currentTime = 0;
plyr.media.muted = instance.isMuted(); plyr.media.muted = instance.isMuted();
// Set title // Set title
@ -1698,6 +1696,9 @@
// Trigger timeupdate // Trigger timeupdate
_triggerEvent(plyr.media, 'timeupdate'); _triggerEvent(plyr.media, 'timeupdate');
// Trigger timeupdate
_triggerEvent(plyr.media, 'durationchange');
// Reset timer // Reset timer
window.clearInterval(timers.buffering); window.clearInterval(timers.buffering);
@ -1722,9 +1723,6 @@
_triggerEvent(plyr.media, 'canplaythrough'); _triggerEvent(plyr.media, 'canplaythrough');
} }
}, 200); }, 200);
// Display duration if available
_displayDuration();
}, },
'onStateChange': function(event) { 'onStateChange': function(event) {
// Get the instance // Get the instance
@ -1769,7 +1767,7 @@
break; break;
} }
_triggerEvent(container, 'statechange', false, { _triggerEvent(plyr.container, 'statechange', false, {
code: event.data code: event.data
}); });
} }
@ -1819,9 +1817,9 @@
plyr.embed.getDuration().then(function(value) { plyr.embed.getDuration().then(function(value) {
plyr.media.duration = value; plyr.media.duration = value;
// Display duration if available // Trigger timeupdate
_displayDuration(); _triggerEvent(plyr.media, 'durationchange');
}); });
// TODO: Captions // TODO: Captions
@ -1895,8 +1893,12 @@
plyr.media.paused = true; plyr.media.paused = true;
plyr.media.currentTime = 0; plyr.media.currentTime = 0;
// Update UI plyr.embed.getDuration(function(value) {
_embedReady(); plyr.media.duration = value/1000;
// Update UI
_embedReady();
});
plyr.embed.getPosition(function(value) { plyr.embed.getPosition(function(value) {
plyr.media.currentTime = value; plyr.media.currentTime = value;
@ -1905,12 +1907,6 @@
_triggerEvent(plyr.media, 'timeupdate'); _triggerEvent(plyr.media, 'timeupdate');
}); });
plyr.embed.getDuration(function(value) {
plyr.media.duration = value/1000;
// Display duration if available
_displayDuration();
});
plyr.embed.bind(window.SC.Widget.Events.PLAY, function() { plyr.embed.bind(window.SC.Widget.Events.PLAY, function() {
plyr.media.paused = false; plyr.media.paused = false;
_triggerEvent(plyr.media, 'play'); _triggerEvent(plyr.media, 'play');
@ -1942,11 +1938,6 @@
plyr.media.paused = true; plyr.media.paused = true;
_triggerEvent(plyr.media, 'ended'); _triggerEvent(plyr.media, 'ended');
}); });
// Autoplay
if (config.autoplay) {
plyr.embed.play();
}
}); });
} }
@ -2093,6 +2084,7 @@
// Check playing state // Check playing state
function _checkPlaying() { function _checkPlaying() {
_toggleClass(plyr.container, config.classes.playing, !plyr.media.paused); _toggleClass(plyr.container, config.classes.playing, !plyr.media.paused);
_toggleClass(plyr.container, config.classes.stopped, plyr.media.paused); _toggleClass(plyr.container, config.classes.stopped, plyr.media.paused);
_toggleControls(plyr.media.paused); _toggleControls(plyr.media.paused);
@ -2115,7 +2107,6 @@
function _toggleFullscreen(event) { function _toggleFullscreen(event) {
// Check for native support // Check for native support
var nativeSupport = fullscreen.supportsFullScreen; var nativeSupport = fullscreen.supportsFullScreen;
if (nativeSupport) { if (nativeSupport) {
// If it's a fullscreen change event, update the UI // If it's a fullscreen change event, update the UI
@ -2138,7 +2129,7 @@
} }
// Check if we're actually full screen (it could fail) // Check if we're actually full screen (it could fail)
// plyr.isFullscreen = fullscreen.isFullScreen(plyr.container); plyr.isFullscreen = fullscreen.isFullScreen(plyr.container);
return; return;
} }
@ -2349,7 +2340,11 @@
// Timer to prevent flicker when seeking // Timer to prevent flicker when seeking
timers.loading = setTimeout(function() { timers.loading = setTimeout(function() {
// Toggle container class hook
_toggleClass(plyr.container, config.classes.loading, loading); _toggleClass(plyr.container, config.classes.loading, loading);
// Show controls if loading, hide if done
_toggleControls(loading);
}, (loading ? 250 : 0)); }, (loading ? 250 : 0));
} }
@ -2578,14 +2573,15 @@
// Show the player controls in fullscreen mode // Show the player controls in fullscreen mode
function _toggleControls(toggle) { function _toggleControls(toggle) {
// Don't hide if config says not to, it's audio, or not loaded/ready // Don't hide if config says not to, it's audio, or not ready or loading
if (!config.hideControls || plyr.type === 'audio' || !_hasClass(plyr.container, config.classes.ready)) { if (!config.hideControls || plyr.type === 'audio') {
return; return;
} }
var delay = 0, var delay = 0,
isEnterFullscreen = false, isEnterFullscreen = false,
show = toggle; show = toggle,
loading = _hasClass(plyr.container, config.classes.loading);
// Default to false if no boolean // Default to false if no boolean
if (!_is.boolean(toggle)) { if (!_is.boolean(toggle)) {
@ -2615,11 +2611,11 @@
window.clearTimeout(timers.hover); window.clearTimeout(timers.hover);
// If the mouse is not over the controls, set a timeout to hide them // If the mouse is not over the controls, set a timeout to hide them
if (show || plyr.media.paused) { if (show || plyr.media.paused || loading) {
_toggleClass(plyr.container, config.classes.hideControls, false); _toggleClass(plyr.container, config.classes.hideControls, false);
// Always show controls when paused or if touch // Always show controls when paused or if touch
if (plyr.media.paused) { if (plyr.media.paused || loading) {
return; return;
} }
@ -2686,6 +2682,9 @@
return; return;
} }
// Remove ready class hook
_toggleClass(plyr.container, config.classes.ready, false);
// Pause playback // Pause playback
_pause(); _pause();
@ -2698,22 +2697,19 @@
// Cancel current network requests // Cancel current network requests
_cancelRequests(); _cancelRequests();
// Remove ready class hook
_toggleClass(plyr.container, config.classes.ready, false);
// Setup new source // Setup new source
function setup() { function setup() {
// Remove embed object // Remove embed object
plyr.embed = null; plyr.embed = null;
// Remove the old media
_remove(plyr.media);
// Remove video container // Remove video container
if (plyr.type === 'video' && plyr.videoContainer) { if (plyr.type === 'video' && plyr.videoContainer) {
_remove(plyr.videoContainer); _remove(plyr.videoContainer);
} }
// Remove the old media
_remove(plyr.media);
// Reset class name // Reset class name
if (plyr.container) { if (plyr.container) {
plyr.container.removeAttribute('class'); plyr.container.removeAttribute('class');
@ -2800,21 +2796,16 @@
// Load HTML5 sources // Load HTML5 sources
plyr.media.load(); plyr.media.load();
}
// If HTML5 or embed but not fully supported, setupInterface and call ready now
if (_inArray(config.types.html5, plyr.type) || (_inArray(config.types.embed, plyr.type) && !plyr.supported.full)) {
// Setup interface // Setup interface
_setupInterface(); _setupInterface();
// Display duration if available
_displayDuration();
// Call ready // Call ready
_ready(); _ready();
} }
// If embed but not fully supported, setupInterface and call ready now
else if (_inArray(config.types.embed, plyr.type) && !plyr.supported.full) {
_setupInterface();
_ready();
}
// Set aria title and iframe title // Set aria title and iframe title
config.title = source.title; config.title = source.title;
@ -2906,13 +2897,11 @@
// Keyboard shortcuts // Keyboard shortcuts
if (config.keyboardShorcuts) { if (config.keyboardShorcuts) {
//var held = false; var first = true;
_on(plyr.container, 'keyup keydown', function(event) { _on(plyr.container, 'keydown keyup', function(event) {
var code = getKeyCode(event), var code = getKeyCode(event),
down = event.type === 'keydown', pressed = event.type === 'keydown';
first = true,
timer;
// Seek by the number keys // Seek by the number keys
function seekByKey() { function seekByKey() {
@ -2928,9 +2917,9 @@
_seek((duration / 10) * (code - 48)); _seek((duration / 10) * (code - 48));
} }
function handleKey() { // Handle the key on keydown
console.log(code); // Reset on keyup
if (pressed) {
switch(code) { switch(code) {
// 0-9 // 0-9
case 48: case 48:
@ -2945,7 +2934,7 @@
case 57: if (first) { seekByKey() } break; case 57: if (first) { seekByKey() } break;
// Space and K key // Space and K key
case 32: case 32:
case 75: if (first) { _togglePlay() } break; case 75: if (first) { _togglePlay(); } break;
// Arrow up // Arrow up
case 38: _increaseVolume(); break; case 38: _increaseVolume(); break;
// Arrow down // Arrow down
@ -2971,16 +2960,8 @@
// First run completed // First run completed
first = false; first = false;
} }
if (down) {
handleKey();
// If a key is held for 200ms, run again
// Handy for volume and skip
timer = setTimeout(handleKey, 200);
}
else { else {
clearTimeout(timer); first = true;
} }
}); });
} }
@ -3108,22 +3089,16 @@
// Handle the media finishing // Handle the media finishing
_on(plyr.media, 'ended', function() { _on(plyr.media, 'ended', function() {
// Clear
if (plyr.type === 'video') {
_setCaption();
}
// Reset UI
_checkPlaying();
// Seek to 0
_seek(0);
// Reset duration display
_displayDuration();
// Show poster on end // Show poster on end
if(plyr.type === 'video' && config.showPosterOnEnd) { if(plyr.type === 'video' && config.showPosterOnEnd) {
// Clear
if (plyr.type === 'video') {
_setCaption();
}
// Restart
_seek();
// Re-load media // Re-load media
plyr.media.load(); plyr.media.load();
} }
@ -3136,7 +3111,7 @@
_on(plyr.media, 'volumechange', _updateVolume); _on(plyr.media, 'volumechange', _updateVolume);
// Handle native play/pause // Handle native play/pause
_on(plyr.media, 'play pause', _checkPlaying); _on(plyr.media, 'play pause ended', _checkPlaying);
// Loading // Loading
_on(plyr.media, 'waiting canplay seeked', _checkLoading); _on(plyr.media, 'waiting canplay seeked', _checkLoading);
@ -3180,7 +3155,7 @@
} }
// Proxy events to container // Proxy events to container
_on(plyr.media, config.events.join(' '), function(event) { _on(plyr.media, config.events.concat(['keyup', 'keydown']).join(' '), function(event) {
_triggerEvent(plyr.container, event.type, true); _triggerEvent(plyr.container, event.type, true);
}); });
} }
@ -3209,7 +3184,7 @@
plyr.media.load(); plyr.media.load();
// Debugging // Debugging
_log('Cancelled network requests for old media'); _log('Cancelled network requests');
} }
// Destroy an instance // Destroy an instance
@ -3347,25 +3322,16 @@
_setupMedia(); _setupMedia();
// Setup interface // Setup interface
if (_inArray(config.types.html5, plyr.type)) { // If embed but not fully supported, setupInterface (to avoid flash of controls) and call ready now
if (_inArray(config.types.html5, plyr.type) || (_inArray(config.types.embed, plyr.type) && !plyr.supported.full)) {
// Setup UI // Setup UI
_setupInterface(); _setupInterface();
// Set title on button and frame
_setTitle();
// Autoplay
if (config.autoplay) {
_play();
}
// Call ready // Call ready
_ready(); _ready();
}
// If embed but not fully supported, setupInterface (to avoid flash of controls) and call ready now // Set title on button and frame
else if (_inArray(config.types.embed, plyr.type) && !plyr.supported.full) { _setTitle();
_setupInterface();
_ready();
} }
// Successful setup // Successful setup
@ -3429,9 +3395,6 @@
// Update the UI // Update the UI
_checkPlaying(); _checkPlaying();
// Display duration
_displayDuration();
} }
api = { api = {
@ -3441,6 +3404,7 @@
getMedia: function() { return plyr.media; }, getMedia: function() { return plyr.media; },
getType: function() { return plyr.type; }, getType: function() { return plyr.type; },
isReady: function() { return _hasClass(plyr.container, config.classes.ready); }, isReady: function() { return _hasClass(plyr.container, config.classes.ready); },
isLoading: function() { return _hasClass(plyr.container, config.classes.loading); },
on: function(event, callback) { _on(plyr.container, event, callback); }, on: function(event, callback) { _on(plyr.container, event, callback); },
play: _play, play: _play,
pause: _pause, pause: _pause,
@ -3476,6 +3440,11 @@
// Store a refernce to instance // Store a refernce to instance
plyr.media.plyr = api; plyr.media.plyr = api;
// Autoplay
if (config.autoplay) {
_play();
}
} }
// Initialize instance // Initialize instance
@ -3670,7 +3639,7 @@
if (config.debug) { if (config.debug) {
var events = config.events.concat(['setup', 'ready', 'statechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled']); var events = config.events.concat(['setup', 'ready', 'statechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled']);
_on(instance.getContainer(), events.join(' '), function() { _on(instance.getContainer(), events.join(' '), function(event) {
console.log([config.logPrefix, 'event:', event.type].join(' '), event.detail.plyr); console.log([config.logPrefix, 'event:', event.type].join(' '), event.detail.plyr);
}); });
} }
@ -3704,7 +3673,9 @@
instances = []; instances = [];
Array.prototype.slice.call(elements).forEach(function(element) { Array.prototype.slice.call(elements).forEach(function(element) {
instances.push(element.plyr); if (_is.object(element.plyr)) {
instances.push(element.plyr);
}
}); });
return instances; return instances;

View File

@ -728,7 +728,7 @@
width: 100%; width: 100%;
z-index: 10000000; z-index: 10000000;
background: #000; background: #000;
border-radius: 0; border-radius: 0 !important;
video { video {
height: 100%; height: 100%;

View File

@ -727,7 +727,7 @@
width: 100%; width: 100%;
z-index: 10000000; z-index: 10000000;
background: #000; background: #000;
border-radius: 0; border-radius: 0 !important;
video { video {
height: 100%; height: 100%;