Last active
November 8, 2018 15:44
-
-
Save townofdon/0b09ad7bdd2cba32582da87c34304043 to your computer and use it in GitHub Desktop.
useful polyfills
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Polyfill - Array.prototype.findIndex | |
* | |
* https://tc39.github.io/ecma262/#sec-array.prototype.findIndex | |
*/ | |
if (!Array.prototype.findIndex) { | |
Object.defineProperty(Array.prototype, 'findIndex', { | |
value: function(predicate) { | |
// 1. Let O be ? ToObject(this value). | |
if (this == null) { | |
throw new TypeError('"this" is null or not defined'); | |
} | |
var o = Object(this); | |
// 2. Let len be ? ToLength(? Get(O, "length")). | |
var len = o.length >>> 0; | |
// 3. If IsCallable(predicate) is false, throw a TypeError exception. | |
if (typeof predicate !== 'function') { | |
throw new TypeError('predicate must be a function'); | |
} | |
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined. | |
var thisArg = arguments[1]; | |
// 5. Let k be 0. | |
var k = 0; | |
// 6. Repeat, while k < len | |
while (k < len) { | |
// a. Let Pk be ! ToString(k). | |
// b. Let kValue be ? Get(O, Pk). | |
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). | |
// d. If testResult is true, return k. | |
var kValue = o[k]; | |
if (predicate.call(thisArg, kValue, k, o)) { | |
return k; | |
} | |
// e. Increase k by 1. | |
k++; | |
} | |
// 7. Return -1. | |
return -1; | |
}, | |
configurable: true, | |
writable: true | |
}); | |
} | |
/** | |
* Polyfill - Object.keys | |
* | |
* https://stackoverflow.com/a/6268840/4262653 | |
*/ | |
if(!Object.keys) Object.keys = function(o){ | |
if (o !== Object(o)) | |
throw new TypeError('Object.keys called on non-object'); | |
var ret=[],p; | |
for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p); | |
return ret; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Polyfills for LocalStorage and SessionStorage. | |
* Shamlesslessly copied from other sources. | |
*/ | |
/** | |
* Backwards compatibility for localStorage on older browsers | |
* Grabbed from: https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage | |
*/ | |
if (!window.localStorage) { | |
window.localStorage = { | |
getItem: function (sKey) { | |
if (!sKey || !this.hasOwnProperty(sKey)) { return null; } | |
return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1")); | |
}, | |
key: function (nKeyId) { | |
return unescape(document.cookie.replace(/\s*\=(?:.(?!;))*$/, "").split(/\s*\=(?:[^;](?!;))*[^;]?;\s*/)[nKeyId]); | |
}, | |
setItem: function (sKey, sValue) { | |
if(!sKey) { return; } | |
document.cookie = escape(sKey) + "=" + escape(sValue) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/"; | |
this.length = document.cookie.match(/\=/g).length; | |
}, | |
length: 0, | |
removeItem: function (sKey) { | |
if (!sKey || !this.hasOwnProperty(sKey)) { return; } | |
document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; | |
this.length--; | |
}, | |
hasOwnProperty: function (sKey) { | |
return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); | |
} | |
}; | |
window.localStorage.length = (document.cookie.match(/\=/g) || window.localStorage).length; | |
} | |
/** | |
* Backwards compatibility for sessionStorage on older browsers | |
* | |
* See: https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage | |
* Grabbed from: https://gist.github.com/juliocesar/926500 | |
* NOTE - Opening a page in a new tab or window will cause a new session to be initiated with the value of the top-level browsing context, which differs from how session cookies work. | |
*/ | |
if (!window.sessionStorage) { | |
window.sessionStorage = { | |
_data : {}, | |
setItem : function(id, val) { return this._data[id] = String(val); }, | |
getItem : function(id) { return this._data.hasOwnProperty(id) ? this._data[id] : undefined; }, | |
removeItem : function(id) { return delete this._data[id]; }, | |
clear : function() { return this._data = {}; } | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment