v1/web/modules/contrib/blazy/js/polyfill/blazy.polyfill.js

116 lines
3.7 KiB
JavaScript

/**
* @file
* Provides a few disposable polyfills till IE is gone from planet earth.
*
* @todo remove a few when min D9.2+ since they are included as core polyfills
* and can be made dependencies instead. Unless by then, IE is already gone, and
* core deprecates them like classList.
* @see https://www.drupal.org/node/3243406
* @see https://www.drupal.org/node/3159731
* @see https://www.drupal.org/node/3211146
* @see https://www.drupal.org/node/3079238
* @see https://www.drupal.org/node/3113447
*/
(function (_win) {
'use strict';
var _eProto = Element.prototype;
var _nProto = NodeList.prototype;
var _sProto = String.prototype;
// See https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
if (!_eProto.matches) {
_eProto.matches = _eProto.msMatchesSelector || _eProto.webkitMatchesSelector;
}
// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
// @todo remove when min D9.2 for drupal.element.closest|matches.
// @see http://caniuse.com/#feat=element-closest
// @see http://caniuse.com/#feat=matchesselector
// @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
// @see https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType
// @see https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
if (!_eProto.closest) {
_eProto.closest = function (s) {
var el = this;
do {
if (_eProto.matches.call(el, s)) {
return el;
}
el = el.parentElement || el.parentNode;
} while (el !== null && el.nodeType === 1);
return null;
};
}
// @see https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Polyfill
if (_win.NodeList && !_nProto.forEach) {
_nProto.forEach = Array.prototype.forEach;
}
// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill
// @see https://developer.mozilla.org/en-US/docs/MDN/About#Code_samples_and_snippets
if (typeof Object.assign !== 'function') {
Object.defineProperty(Object, 'assign', {
value: function assign(target, varArgs) {
if (target === null || target === 'undefined') {
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource !== null && nextSource !== 'undefined') {
for (var nextKey in nextSource) {
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true
});
}
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
if (!_sProto.startsWith) {
Object.defineProperty(_sProto, 'startsWith', {
value: function (search, rawPos) {
var pos = rawPos > 0 ? rawPos | 0 : 0;
return this.substring(pos, pos + search.length) === search;
}
});
}
// IE >= 9 compat, else SCRIPT445: Object doesn't support this action.
// @see https://msdn.microsoft.com/library/ff975299(v=vs.85).aspx.
if (typeof _win.CustomEvent === 'function') {
return false;
}
function CustomEvent(event, params) {
params = params || {
bubbles: false,
cancelable: false,
detail: null
};
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
}
CustomEvent.prototype = _win.Event.prototype;
_win.CustomEvent = CustomEvent;
})(this);