Reduce circular dependencies
This commit is contained in:
1077
dist/plyr.js
vendored
1077
dist/plyr.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/plyr.js.map
vendored
2
dist/plyr.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/plyr.min.js
vendored
2
dist/plyr.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/plyr.min.js.map
vendored
2
dist/plyr.min.js.map
vendored
File diff suppressed because one or more lines are too long
1094
dist/plyr.polyfilled.js
vendored
1094
dist/plyr.polyfilled.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/plyr.polyfilled.js.map
vendored
2
dist/plyr.polyfilled.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/plyr.polyfilled.min.js
vendored
2
dist/plyr.polyfilled.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/plyr.polyfilled.min.js.map
vendored
2
dist/plyr.polyfilled.min.js.map
vendored
File diff suppressed because one or more lines are too long
@ -125,13 +125,17 @@ Include the `plyr.js` script before the closing `</body>` tag and then in your J
|
|||||||
|
|
||||||
See [initialising](#initialising) for more information on advanced setups.
|
See [initialising](#initialising) for more information on advanced setups.
|
||||||
|
|
||||||
If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the JavaScript, you can use the following:
|
You can use our CDN (provided by [Fastly](https://www.fastly.com/)) for the JavaScript. There's 2 versions; one with and one without [polyfills](#polyfills). My recommendation would be to manage polyfills seperately as part of your application but to make life easier you can use the polyfilled build.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<script src="https://cdn.plyr.io/3.3.7/plyr.js"></script>
|
<script src="https://cdn.plyr.io/3.3.7/plyr.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
_Note_: Be sure to read the [polyfills](#polyfills) section below about browser compatibility
|
...or...
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://cdn.plyr.io/3.3.7/plyr.polyfilled.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
### CSS
|
### CSS
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ const captions = {
|
|||||||
|
|
||||||
// Set the span content
|
// Set the span content
|
||||||
if (utils.is.string(caption)) {
|
if (utils.is.string(caption)) {
|
||||||
content.textContent = caption.trim();
|
content.innerText = caption.trim();
|
||||||
} else {
|
} else {
|
||||||
content.appendChild(caption);
|
content.appendChild(caption);
|
||||||
}
|
}
|
||||||
|
182
src/js/controls.js
vendored
182
src/js/controls.js
vendored
@ -6,34 +6,13 @@ import captions from './captions';
|
|||||||
import html5 from './html5';
|
import html5 from './html5';
|
||||||
import i18n from './i18n';
|
import i18n from './i18n';
|
||||||
import support from './support';
|
import support from './support';
|
||||||
import ui from './ui';
|
|
||||||
import utils from './utils';
|
import utils from './utils';
|
||||||
|
|
||||||
// Sniff out the browser
|
// Sniff out the browser
|
||||||
const browser = utils.getBrowser();
|
const browser = utils.getBrowser();
|
||||||
|
|
||||||
const controls = {
|
const controls = {
|
||||||
// Webkit polyfill for lower fill range
|
|
||||||
updateRangeFill(target) {
|
|
||||||
// Get range from event if event passed
|
|
||||||
const range = utils.is.event(target) ? target.target : target;
|
|
||||||
|
|
||||||
// Needs to be a valid <input type='range'>
|
|
||||||
if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set aria value for https://github.com/sampotts/plyr/issues/905
|
|
||||||
range.setAttribute('aria-valuenow', range.value);
|
|
||||||
|
|
||||||
// WebKit only
|
|
||||||
if (!browser.isWebkit) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set CSS custom property
|
|
||||||
range.style.setProperty('--value', `${range.value / range.max * 100}%`);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Get icon URL
|
// Get icon URL
|
||||||
getIconUrl() {
|
getIconUrl() {
|
||||||
@ -373,7 +352,7 @@ const controls = {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.textContent = `% ${suffix.toLowerCase()}`;
|
progress.innerText = `% ${suffix.toLowerCase()}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.elements.display[type] = progress;
|
this.elements.display[type] = progress;
|
||||||
@ -429,6 +408,123 @@ const controls = {
|
|||||||
list.appendChild(item);
|
list.appendChild(item);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Update the displayed time
|
||||||
|
updateTimeDisplay(target = null, time = 0, inverted = false) {
|
||||||
|
// Bail if there's no element to display or the value isn't a number
|
||||||
|
if (!utils.is.element(target) || !utils.is.number(time)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always display hours if duration is over an hour
|
||||||
|
const forceHours = utils.getHours(this.duration) > 0;
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
|
target.innerText = utils.formatTime(time, forceHours, inverted);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Update volume UI and storage
|
||||||
|
updateVolume() {
|
||||||
|
if (!this.supported.ui) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update range
|
||||||
|
if (utils.is.element(this.elements.inputs.volume)) {
|
||||||
|
controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update mute state
|
||||||
|
if (utils.is.element(this.elements.buttons.mute)) {
|
||||||
|
utils.toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Update seek value and lower fill
|
||||||
|
setRange(target, value = 0) {
|
||||||
|
if (!utils.is.element(target)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line
|
||||||
|
target.value = value;
|
||||||
|
|
||||||
|
// Webkit range fill
|
||||||
|
controls.updateRangeFill.call(this, target);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Update <progress> elements
|
||||||
|
updateProgress(event) {
|
||||||
|
if (!this.supported.ui || !utils.is.event(event)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = 0;
|
||||||
|
|
||||||
|
const setProgress = (target, input) => {
|
||||||
|
const value = utils.is.number(input) ? input : 0;
|
||||||
|
const progress = utils.is.element(target) ? target : this.elements.display.buffer;
|
||||||
|
|
||||||
|
// Update value and label
|
||||||
|
if (utils.is.element(progress)) {
|
||||||
|
progress.value = value;
|
||||||
|
|
||||||
|
// Update text label inside
|
||||||
|
const label = progress.getElementsByTagName('span')[0];
|
||||||
|
if (utils.is.element(label)) {
|
||||||
|
label.childNodes[0].nodeValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
switch (event.type) {
|
||||||
|
// Video playing
|
||||||
|
case 'timeupdate':
|
||||||
|
case 'seeking':
|
||||||
|
value = utils.getPercentage(this.currentTime, this.duration);
|
||||||
|
|
||||||
|
// Set seek range value only if it's a 'natural' time event
|
||||||
|
if (event.type === 'timeupdate') {
|
||||||
|
controls.setRange.call(this, this.elements.inputs.seek, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Check buffer status
|
||||||
|
case 'playing':
|
||||||
|
case 'progress':
|
||||||
|
setProgress(this.elements.display.buffer, this.buffered * 100);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Webkit polyfill for lower fill range
|
||||||
|
updateRangeFill(target) {
|
||||||
|
// Get range from event if event passed
|
||||||
|
const range = utils.is.event(target) ? target.target : target;
|
||||||
|
|
||||||
|
// Needs to be a valid <input type='range'>
|
||||||
|
if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set aria value for https://github.com/sampotts/plyr/issues/905
|
||||||
|
range.setAttribute('aria-valuenow', range.value);
|
||||||
|
|
||||||
|
// WebKit only
|
||||||
|
if (!browser.isWebkit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set CSS custom property
|
||||||
|
range.style.setProperty('--value', `${range.value / range.max * 100}%`);
|
||||||
|
},
|
||||||
|
|
||||||
// Update hover tooltip for seeking
|
// Update hover tooltip for seeking
|
||||||
updateSeekTooltip(event) {
|
updateSeekTooltip(event) {
|
||||||
// Bail if setting not true
|
// Bail if setting not true
|
||||||
@ -473,7 +569,7 @@ const controls = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Display the time a click would seek to
|
// Display the time a click would seek to
|
||||||
ui.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
|
controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
|
||||||
|
|
||||||
// Set position
|
// Set position
|
||||||
this.elements.display.seekTooltip.style.left = `${percent}%`;
|
this.elements.display.seekTooltip.style.left = `${percent}%`;
|
||||||
@ -488,6 +584,46 @@ const controls = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Handle time change event
|
||||||
|
timeUpdate(event) {
|
||||||
|
// Only invert if only one time element is displayed and used for both duration and currentTime
|
||||||
|
const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;
|
||||||
|
|
||||||
|
// Duration
|
||||||
|
controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
|
||||||
|
|
||||||
|
// Ignore updates while seeking
|
||||||
|
if (event && event.type === 'timeupdate' && this.media.seeking) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Playing progress
|
||||||
|
controls.updateProgress.call(this, event);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Show the duration on metadataloaded
|
||||||
|
durationUpdate() {
|
||||||
|
if (!this.supported.ui) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there's a spot to display duration
|
||||||
|
const hasDuration = utils.is.element(this.elements.display.duration);
|
||||||
|
|
||||||
|
// If there's only one time display, display duration there
|
||||||
|
if (!hasDuration && this.config.displayDuration && this.paused) {
|
||||||
|
controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there's a duration element, update content
|
||||||
|
if (hasDuration) {
|
||||||
|
controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the tooltip (if visible)
|
||||||
|
controls.updateSeekTooltip.call(this);
|
||||||
|
},
|
||||||
|
|
||||||
// Hide/show a tab
|
// Hide/show a tab
|
||||||
toggleTab(setting, toggle) {
|
toggleTab(setting, toggle) {
|
||||||
utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);
|
utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);
|
||||||
|
@ -250,10 +250,10 @@ class Listeners {
|
|||||||
// Listen for media events
|
// Listen for media events
|
||||||
media() {
|
media() {
|
||||||
// Time change on media
|
// Time change on media
|
||||||
utils.on(this.player.media, 'timeupdate seeking', event => ui.timeUpdate.call(this.player, event));
|
utils.on(this.player.media, 'timeupdate seeking', event => controls.timeUpdate.call(this.player, event));
|
||||||
|
|
||||||
// Display duration
|
// Display duration
|
||||||
utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => ui.durationUpdate.call(this.player, event));
|
utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));
|
||||||
|
|
||||||
// Check for audio tracks on load
|
// Check for audio tracks on load
|
||||||
// We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
|
// We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
|
||||||
@ -272,10 +272,10 @@ class Listeners {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Check for buffer progress
|
// Check for buffer progress
|
||||||
utils.on(this.player.media, 'progress playing', event => ui.updateProgress.call(this.player, event));
|
utils.on(this.player.media, 'progress playing', event => controls.updateProgress.call(this.player, event));
|
||||||
|
|
||||||
// Handle volume changes
|
// Handle volume changes
|
||||||
utils.on(this.player.media, 'volumechange', event => ui.updateVolume.call(this.player, event));
|
utils.on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));
|
||||||
|
|
||||||
// Handle play/pause
|
// Handle play/pause
|
||||||
utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));
|
utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));
|
||||||
@ -549,7 +549,8 @@ class Listeners {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.player.config.invertTime = !this.player.config.invertTime;
|
this.player.config.invertTime = !this.player.config.invertTime;
|
||||||
ui.timeUpdate.call(this.player);
|
|
||||||
|
controls.timeUpdate.call(this.player);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,6 +133,7 @@ const support = {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
window.addEventListener('test', null, options);
|
window.addEventListener('test', null, options);
|
||||||
|
window.removeEventListener('test', null, options);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
|
140
src/js/ui.js
140
src/js/ui.js
@ -74,10 +74,10 @@ const ui = {
|
|||||||
this.quality = null;
|
this.quality = null;
|
||||||
|
|
||||||
// Reset volume display
|
// Reset volume display
|
||||||
ui.updateVolume.call(this);
|
controls.updateVolume.call(this);
|
||||||
|
|
||||||
// Reset time display
|
// Reset time display
|
||||||
ui.timeUpdate.call(this);
|
controls.timeUpdate.call(this);
|
||||||
|
|
||||||
// Update the UI
|
// Update the UI
|
||||||
ui.checkPlaying.call(this);
|
ui.checkPlaying.call(this);
|
||||||
@ -218,142 +218,6 @@ const ui = {
|
|||||||
this.toggleControls(this.loading);
|
this.toggleControls(this.loading);
|
||||||
}, this.loading ? 250 : 0);
|
}, this.loading ? 250 : 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Update volume UI and storage
|
|
||||||
updateVolume() {
|
|
||||||
if (!this.supported.ui) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update range
|
|
||||||
if (utils.is.element(this.elements.inputs.volume)) {
|
|
||||||
ui.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update mute state
|
|
||||||
if (utils.is.element(this.elements.buttons.mute)) {
|
|
||||||
utils.toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Update seek value and lower fill
|
|
||||||
setRange(target, value = 0) {
|
|
||||||
if (!utils.is.element(target)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line
|
|
||||||
target.value = value;
|
|
||||||
|
|
||||||
// Webkit range fill
|
|
||||||
controls.updateRangeFill.call(this, target);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Set <progress> value
|
|
||||||
setProgress(target, input) {
|
|
||||||
const value = utils.is.number(input) ? input : 0;
|
|
||||||
const progress = utils.is.element(target) ? target : this.elements.display.buffer;
|
|
||||||
|
|
||||||
// Update value and label
|
|
||||||
if (utils.is.element(progress)) {
|
|
||||||
progress.value = value;
|
|
||||||
|
|
||||||
// Update text label inside
|
|
||||||
const label = progress.getElementsByTagName('span')[0];
|
|
||||||
if (utils.is.element(label)) {
|
|
||||||
label.childNodes[0].nodeValue = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Update <progress> elements
|
|
||||||
updateProgress(event) {
|
|
||||||
if (!this.supported.ui || !utils.is.event(event)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let value = 0;
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
switch (event.type) {
|
|
||||||
// Video playing
|
|
||||||
case 'timeupdate':
|
|
||||||
case 'seeking':
|
|
||||||
value = utils.getPercentage(this.currentTime, this.duration);
|
|
||||||
|
|
||||||
// Set seek range value only if it's a 'natural' time event
|
|
||||||
if (event.type === 'timeupdate') {
|
|
||||||
ui.setRange.call(this, this.elements.inputs.seek, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Check buffer status
|
|
||||||
case 'playing':
|
|
||||||
case 'progress':
|
|
||||||
ui.setProgress.call(this, this.elements.display.buffer, this.buffered * 100);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Update the displayed time
|
|
||||||
updateTimeDisplay(target = null, time = 0, inverted = false) {
|
|
||||||
// Bail if there's no element to display or the value isn't a number
|
|
||||||
if (!utils.is.element(target) || !utils.is.number(time)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always display hours if duration is over an hour
|
|
||||||
const forceHours = utils.getHours(this.duration) > 0;
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-param-reassign
|
|
||||||
target.textContent = utils.formatTime(time, forceHours, inverted);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Handle time change event
|
|
||||||
timeUpdate(event) {
|
|
||||||
// Only invert if only one time element is displayed and used for both duration and currentTime
|
|
||||||
const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;
|
|
||||||
|
|
||||||
// Duration
|
|
||||||
ui.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
|
|
||||||
|
|
||||||
// Ignore updates while seeking
|
|
||||||
if (event && event.type === 'timeupdate' && this.media.seeking) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Playing progress
|
|
||||||
ui.updateProgress.call(this, event);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Show the duration on metadataloaded
|
|
||||||
durationUpdate() {
|
|
||||||
if (!this.supported.ui) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there's a spot to display duration
|
|
||||||
const hasDuration = utils.is.element(this.elements.display.duration);
|
|
||||||
|
|
||||||
// If there's only one time display, display duration there
|
|
||||||
if (!hasDuration && this.config.displayDuration && this.paused) {
|
|
||||||
ui.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there's a duration element, update content
|
|
||||||
if (hasDuration) {
|
|
||||||
ui.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the tooltip (if visible)
|
|
||||||
controls.updateSeekTooltip.call(this);
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ui;
|
export default ui;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
import loadjs from 'loadjs';
|
import loadjs from 'loadjs';
|
||||||
|
import Storage from './storage';
|
||||||
import support from './support';
|
import support from './support';
|
||||||
import { providers } from './types';
|
import { providers } from './types';
|
||||||
|
|
||||||
@ -156,6 +157,8 @@ const utils = {
|
|||||||
|
|
||||||
// Only load once if ID set
|
// Only load once if ID set
|
||||||
if (!hasId || !exists()) {
|
if (!hasId || !exists()) {
|
||||||
|
const useStorage = Storage.supported;
|
||||||
|
|
||||||
// Create container
|
// Create container
|
||||||
const container = document.createElement('div');
|
const container = document.createElement('div');
|
||||||
utils.toggleHidden(container, true);
|
utils.toggleHidden(container, true);
|
||||||
@ -165,7 +168,7 @@ const utils = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check in cache
|
// Check in cache
|
||||||
if (support.storage) {
|
if (useStorage) {
|
||||||
const cached = window.localStorage.getItem(prefix + id);
|
const cached = window.localStorage.getItem(prefix + id);
|
||||||
isCached = cached !== null;
|
isCached = cached !== null;
|
||||||
|
|
||||||
@ -184,7 +187,7 @@ const utils = {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (support.storage) {
|
if (useStorage) {
|
||||||
window.localStorage.setItem(
|
window.localStorage.setItem(
|
||||||
prefix + id,
|
prefix + id,
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
@ -247,7 +250,7 @@ const utils = {
|
|||||||
|
|
||||||
// Add text node
|
// Add text node
|
||||||
if (utils.is.string(text)) {
|
if (utils.is.string(text)) {
|
||||||
element.textContent = text;
|
element.innerText = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return built element
|
// Return built element
|
||||||
@ -580,7 +583,7 @@ const utils = {
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
return input.toString().replace(/{(\d+)}/g, (match, i) => utils.is.string(args[i]) ? args[i] : '');
|
return input.toString().replace(/{(\d+)}/g, (match, i) => (utils.is.string(args[i]) ? args[i] : ''));
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get percentage
|
// Get percentage
|
||||||
|
Reference in New Issue
Block a user