JAVASCRIPT   8

polyfill.js

Guest on 20th July 2021 03:31:51 PM

  1. 'use strict';
  2.  
  3. import document from 'global/document';
  4. import Promise from 'promise-polyfill';
  5.  
  6. /**
  7.  * Polyfill
  8.  *
  9.  * Mimics the missing methods like Object.assign, CustomEvent, etc., as a way to avoid including the whole list
  10.  * of polyfills provided by Babel.
  11.  */
  12.  
  13. // ChildNode.remove polyfill
  14. // from: https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md
  15. (function (arr) {
  16.         arr.forEach(function (item) {
  17.                 if (item.hasOwnProperty('remove')) {
  18.                         return;
  19.                 }
  20.                 Object.defineProperty(item, 'remove', {
  21.                         configurable: true,
  22.                         enumerable: true,
  23.                         writable: true,
  24.                         value: function remove() {
  25.                                 this.parentNode.removeChild(this);
  26.                         }
  27.                 });
  28.         });
  29. })([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
  30.  
  31. // CustomEvent polyfill
  32. // Reference: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent
  33. (function () {
  34.  
  35.         if ( typeof window.CustomEvent === 'function' ) {
  36.                 return false;
  37.         }
  38.  
  39.         function CustomEvent ( event, params ) {
  40.                 params = params || { bubbles: false, cancelable: false, detail: undefined };
  41.                 const evt = document.createEvent( 'CustomEvent' );
  42.                 evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
  43.                 return evt;
  44.         }
  45.  
  46.         CustomEvent.prototype = window.Event.prototype;
  47.         window.CustomEvent = CustomEvent;
  48. })();
  49.  
  50. // Object.assign polyfill
  51. // Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill
  52. if (typeof Object.assign !== 'function') {
  53.         Object.assign = function (target) { // .length of function is 2
  54.  
  55.                 if (target === null || target === undefined) { // TypeError if undefined or null
  56.                         throw new TypeError('Cannot convert undefined or null to object');
  57.                 }
  58.  
  59.                 const to = Object(target);
  60.  
  61.                 for (let index = 1, total = arguments.length; index < total; index++) {
  62.                         const nextSource = arguments[index];
  63.  
  64.                         if (nextSource !== null) { // Skip over if undefined or null
  65.                                 for (const nextKey in nextSource) {
  66.                                         // Avoid bugs when hasOwnProperty is shadowed
  67.                                         if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
  68.                                                 to[nextKey] = nextSource[nextKey];
  69.                                         }
  70.                                 }
  71.                         }
  72.                 }
  73.                 return to;
  74.         };
  75. }
  76.  
  77. // String.startsWith polyfill
  78. // Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill
  79. if (!String.prototype.startsWith) {
  80.         String.prototype.startsWith = function(searchString, position){
  81.                 position = position || 0;
  82.                 return this.substr(position, searchString.length) === searchString;
  83.         };
  84. }
  85.  
  86. // Element.matches polyfill
  87. // Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
  88. if (!Element.prototype.matches) {
  89.         Element.prototype.matches =
  90.                 Element.prototype.matchesSelector ||
  91.                 Element.prototype.mozMatchesSelector ||
  92.                 Element.prototype.msMatchesSelector ||
  93.                 Element.prototype.oMatchesSelector ||
  94.                 Element.prototype.webkitMatchesSelector ||
  95.                 function(s) {
  96.                         let matches = (this.document || this.ownerDocument).querySelectorAll(s),
  97.                                 i = matches.length - 1;
  98.                         while (--i >= 0 && matches.item(i) !== this) {}
  99.                         return i > -1;
  100.                 };
  101. }
  102.  
  103. // Element.closest polyfill
  104. // Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
  105. if (window.Element && !Element.prototype.closest) {
  106.         Element.prototype.closest =
  107.                 function(s) {
  108.                         let matches = (this.document || this.ownerDocument).querySelectorAll(s),
  109.                                 i,
  110.                                 el = this;
  111.                         do {
  112.                                 i = matches.length;
  113.                                 while (--i >= 0 && matches.item(i) !== el) {}
  114.                         } while ((i < 0) && (el = el.parentElement));
  115.                         return el;
  116.                 };
  117. }
  118.  
  119. // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
  120. // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
  121.  
  122. // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
  123. l// MIT license
  124. e
  125.  
  126. (function() {
  127.         let lastTime = 0;
  128.         const vendors = ['ms', 'moz', 'webkit', '];
  129.         for(let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
  130.                 window.requestAnimationFrame = window[vendors[x]+'+'RequestAnimationFrame'];
  131.                 window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
  132.                         || window[vendors[x]+'CancelRequestAnimationFrame'];
  133.         }
  134.  
  135.         if (!window.requestAnimationFrame)
  136.                 window.requestAnimationFrame = function(callback) {
  137.                         const currTime = new Date().getTime();
  138.                         const timeToCall = Math.max(0, 16 - (currTime - lastTime));
  139.                         const id = window.setTimeout(function() { callback(currTime + timeToCall); },
  140.                                 timeToCall);
  141.                         lastTime = currTime + timeToCall;
  142.                         return id;
  143.                 };
  144.  
  145.         if (!window.cancelAnimationFrame)
  146.                 window.cancelAnimationFrame = function(id) {
  147.                         clearTimeout(id);
  148.                 };
  149. }());// Javascript workaround for FF iframe `getComputedStyle` bug
  150. // Reference: https://stackoverflow.com/questions/32659801/javascript-workaround-for-firefox-iframe-getcomputedstyle-bug/32660009#32660009
  151. 9
  152. if (irefox/i.t.test(navigator.userAgent)) {
  153.         var getComputedStyle = window.getComputedStyle;
  154.         window.getComputedStyle = (el, pseudoEl) => {
  155.                 const t = getComputedStyle(el, pseudoEl);
  156.                 return (t === null) ? {getPropertyValue: function () {}} : t;
  157.         }
  158. }// Integrate Promise polyfill if not detected
  159. // Used https://github.com/taylorhakes/promise-polyfill
  160. l
  161. if (!window.Promise) {
  162.         window.Promise = Promise;
  163. }// Overwrites native 'children' prototype.
  164. // Adds Document & DocumentFragment support for IE9 & Safari.
  165. // Returns array instead of HTMLCollection.
  166. // Reference: https://developer.mozilla.org/en-US/docs/Web/API/ParentNode/children#Polyfill
  167. l
  168. (function(constructor) {
  169.         if (constructor && constructor.prototype && constructor.prototype.children === null) {
  170.                 Object.defineProperty(constructor.prototype, 'children', {
  171.                         get: function() {
  172.                                 let i = 0, node, nodes = this.childNodes, children = [];
  173.                                 while ((node = nodes[i++])) {
  174.                                         if (node.nodeType === 1) {
  175.                                                 children.push(node);
  176.                                         }
  177.                                 }
  178.                                 return children;
  179.                         }
  180.                 });
  181.         }
  182. })(window.Node || window.Element

Raw Paste


Login or Register to edit or fork this paste. It's free.