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.js61
1 files changed, 35 insertions, 26 deletions
diff --git a/src/js/plyr.js b/src/js/plyr.js
index 459bc6fd..1d3f7e93 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -1194,6 +1194,7 @@
var player = this;
var timers = {};
var api = {};
+ player.ready = false;
// Get the media element
player.media = media;
@@ -1282,7 +1283,6 @@
if (utils.is.string(element)) {
utils.removeElement(player.elements[element]);
player.elements[element] = null;
-
} else {
utils.removeElement(element);
}
@@ -3389,9 +3389,6 @@
return;
}
- // Remove ready class hook
- player.ready = false;
-
// Stop playback
player.stop();
@@ -3410,7 +3407,7 @@
player.embed = null;
// Remove media
- removeElement('media');
+ removeElement(player.media);
// Remove the old captions
removeElement('captions');
@@ -4111,6 +4108,8 @@
// Everything done
function ready() {
+ player.ready = true;
+
// Ready event at end of execution stack
trigger(player.elements.container, 'ready', true);
@@ -4209,7 +4208,7 @@
player.elements.container = utils.wrap(target, utils.createElement('div'));
// Cache original element state for .destroy()
- player.original = target.cloneNode(true);
+ player.elements.original = target.cloneNode(true);
// Allow focus to be captured
player.elements.container.setAttribute('tabindex', 0);
@@ -5007,28 +5006,29 @@
// http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
Player.prototype.destroy = function(callback, restore) {
var player = this;
+
// Type specific stuff
switch (player.type) {
case 'youtube':
// Clear timers
- window.clearInterval(player.timers.buffering);
- window.clearInterval(player.timers.playing);
+ window.clearInterval(player.core.timers.buffering);
+ window.clearInterval(player.core.timers.playing);
// Destroy YouTube API
player.embed.destroy();
// Clean up
- cleanUp();
+ done();
break;
case 'vimeo':
// Destroy Vimeo API
// then clean up (wait, to prevent postmessage errors)
- player.embed.unload().then(cleanUp);
+ player.embed.unload().then(done);
// Vimeo does not always return
- window.setTimeout(cleanUp, 200);
+ window.setTimeout(done, 200);
break;
@@ -5038,35 +5038,44 @@
player.core.toggleNativeControls(true);
// Clean up
- cleanUp();
+ done();
break;
}
- function cleanUp() {
+ function done() {
+ // Bail if already destroyed
+ if (!player.ready) {
+ return;
+ }
+
// Default to restore original element
if (!utils.is.boolean(restore)) {
restore = true;
}
- // Callback
- if (utils.is.function(callback)) {
- callback.call(player.original);
- }
-
- // Bail if we don't need to restore the original element
- if (!restore) {
- return;
- }
+ // Reset overflow (incase destroyed while in fullscreen)
+ document.body.style.overflow = '';
// Replace the container with the original element provided
- player.elements.container.parentNode.replaceChild(player.original, player.elements.container);
+ if (restore) {
+ var parent = player.elements.container.parentNode;
- // Reset overflow (incase destroyed while fullscreen)
- document.body.style.overflow = '';
+ if (utils.is.htmlElement(parent)) {
+ parent.replaceChild(player.elements.original, player.elements.container);
+ }
+ }
+
+ // Remove ready state
+ player.ready = false;
// Event
- player.core.trigger(player.original, 'destroyed', true);
+ player.core.trigger(player.elements.original, 'destroyed', true);
+
+ // Callback
+ if (utils.is.function(callback)) {
+ callback.call(player.elements.original);
+ }
}
// Allow chaining