blazy-8.x-2.x-dev/js/src/plugin/blazy.multimedia.js
js/src/plugin/blazy.multimedia.js
/**
* @file
* Provides Multimedia integration.
*
* @internal
* This is an internal part of the Blazy system and should only be used by
* blazy-related code in Blazy module, or its sub-modules.
*/
(function ($, _doc) {
'use strict';
// Credit: https://stackoverflow.com/questions/6877403
// https://caniuse.com/?search=HTMLMediaElement
var PROTO = HTMLMediaElement.prototype;
if (!PROTO.playing) {
Object.defineProperty(PROTO, 'playing', {
get: function () {
return !!(this.currentTime > 0 &&
!this.paused &&
!this.ended &&
this.readyState > 2);
}
});
}
var S_PLAYING = '.is-playing';
var S_ICON_CLOSE = '.media__icon--close';
/**
* Pause a video/ audio element.
*
* @param {String} type
* A media type for querySelectorAll, default to both audio and video.
* @param {Document|Element} ctx
* An element to use as context for querySelectorAll, default to document.
* @param {Element} current
* A current playing video/ audio element.
*
* @return {Object}
* The current dBlazy collection object.
*/
function pause(type, ctx, current) {
type = type || 'audio, video';
var els = $.findAll(ctx, type);
var chainCallback = function (el) {
if ($.isElm(el) && el !== current) {
if (el.playing) {
el.pause();
}
}
};
return $.chain(els, chainCallback);
}
/**
* Pause other video/ audio elements.
*
* @param {Event} e
* A playing video/ audio event.
*/
function pauseOthers(e) {
var target = e.target;
var el = $.find(_doc, S_PLAYING);
var btn;
// Pause other local media.
pause(null, _doc, target);
// Stop iframe media players.
if ($.isElm(el)) {
btn = $.find(el, S_ICON_CLOSE);
if ($.isElm(btn)) {
btn.click();
}
}
}
/**
* Initialize a video/ audio element.
*
* @param {Element} el
* A video/ audio element.
*/
function init(el) {
$.on(el, 'playing', pauseOthers);
}
$.multimedia = {
init: init,
// listeners: listeners,
// toggle: toggle,
// play: play,
pause: pause
};
})(dBlazy, this.document);
