237 lines
6.7 KiB
JavaScript
237 lines
6.7 KiB
JavaScript
(function() {
|
|
var VENDORS = ['webkit', 'moz', 'o', 'ms'],
|
|
canary = window.document.createElement('div'),
|
|
i = -1;
|
|
|
|
// window.requestAnimationFrame
|
|
|
|
for (i = 0; i < VENDORS.length && !window.requestAnimationFrame; i++) {
|
|
window.requestAnimationFrame = window[VENDORS[i] + 'RequestAnimationFrame'];
|
|
}
|
|
|
|
// Element.nextElementSibling
|
|
|
|
if (typeof canary.nextElementSibling === 'undefined') {
|
|
Object.defineProperty(window.Element.prototype, 'nextElementSibling', {
|
|
get: function() {
|
|
var el = this.nextSibling;
|
|
|
|
while (el) {
|
|
if (el.nodeType === 1) {
|
|
return el;
|
|
}
|
|
|
|
el = el.nextSibling;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
});
|
|
}
|
|
|
|
// Element.matches
|
|
|
|
(function(ElementPrototype) {
|
|
ElementPrototype.matches =
|
|
ElementPrototype.matches ||
|
|
ElementPrototype.machesSelector ||
|
|
ElementPrototype.mozMatchesSelector ||
|
|
ElementPrototype.msMatchesSelector ||
|
|
ElementPrototype.oMatchesSelector ||
|
|
ElementPrototype.webkitMatchesSelector ||
|
|
function (selector) {
|
|
return Array.prototype.indexOf.call(this.parentElement.querySelectorAll(selector), this) > -1;
|
|
};
|
|
})(window.Element.prototype);
|
|
|
|
// Object.keys
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
|
|
|
|
if (!Object.keys) {
|
|
Object.keys = (function() {
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
|
hasDontEnumBug = false,
|
|
dontEnums = [],
|
|
dontEnumsLength = -1;
|
|
|
|
hasDontEnumBug = !({
|
|
toString: null
|
|
})
|
|
.propertyIsEnumerable('toString');
|
|
|
|
dontEnums = [
|
|
'toString',
|
|
'toLocaleString',
|
|
'valueOf',
|
|
'hasOwnProperty',
|
|
'isPrototypeOf',
|
|
'propertyIsEnumerable',
|
|
'constructor'
|
|
];
|
|
|
|
dontEnumsLength = dontEnums.length;
|
|
|
|
return function(obj) {
|
|
var result = [],
|
|
prop = '',
|
|
i = -1;
|
|
|
|
if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
|
|
throw new TypeError('Object.keys called on non-object');
|
|
}
|
|
|
|
for (prop in obj) {
|
|
if (hasOwnProperty.call(obj, prop)) {
|
|
result.push(prop);
|
|
}
|
|
}
|
|
|
|
if (hasDontEnumBug) {
|
|
for (i = 0; i < dontEnumsLength; i++) {
|
|
if (hasOwnProperty.call(obj, dontEnums[i])) {
|
|
result.push(dontEnums[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
};
|
|
}());
|
|
}
|
|
|
|
// Array.isArray
|
|
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
|
|
|
|
if (!Array.isArray) {
|
|
Array.isArray = function(arg) {
|
|
return Object.prototype.toString.call(arg) === '[object Array]';
|
|
};
|
|
}
|
|
|
|
// Object.create
|
|
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create
|
|
|
|
if (typeof Object.create !== 'function') {
|
|
Object.create = (function(undefined) {
|
|
var Temp = function() {};
|
|
|
|
return function (prototype, propertiesObject) {
|
|
if (prototype !== Object(prototype) && prototype !== null) {
|
|
throw TypeError('Argument must be an object, or null');
|
|
}
|
|
|
|
Temp.prototype = prototype || {};
|
|
|
|
var result = new Temp();
|
|
|
|
Temp.prototype = null;
|
|
|
|
if (propertiesObject !== undefined) {
|
|
Object.defineProperties(result, propertiesObject);
|
|
}
|
|
|
|
if (prototype === null) {
|
|
/* jshint ignore:start */
|
|
result.__proto__ = null;
|
|
/* jshint ignore:end */
|
|
}
|
|
|
|
return result;
|
|
};
|
|
})();
|
|
}
|
|
|
|
// String.prototyoe.trim
|
|
|
|
if (!String.prototype.trim) {
|
|
String.prototype.trim = function() {
|
|
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
|
};
|
|
}
|
|
|
|
// Array.prototype.indexOf
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
|
|
|
|
if (!Array.prototype.indexOf) {
|
|
Array.prototype.indexOf = function(searchElement) {
|
|
var n, k, t, len;
|
|
|
|
if (this === null) {
|
|
throw new TypeError();
|
|
}
|
|
|
|
t = Object(this);
|
|
|
|
len = t.length >>> 0;
|
|
|
|
if (len === 0) {
|
|
return -1;
|
|
}
|
|
|
|
n = 0;
|
|
|
|
if (arguments.length > 1) {
|
|
n = Number(arguments[1]);
|
|
|
|
if (n !== n) {
|
|
n = 0;
|
|
} else if (n !== 0 && n !== Infinity && n !== -Infinity) {
|
|
n = (n > 0 || -1) * Math.floor(Math.abs(n));
|
|
}
|
|
}
|
|
|
|
if (n >= len) {
|
|
return -1;
|
|
}
|
|
|
|
for (k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); k < len; k++) {
|
|
if (k in t && t[k] === searchElement) {
|
|
return k;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
};
|
|
}
|
|
|
|
// Function.prototype.bind
|
|
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
|
|
|
|
if (!Function.prototype.bind) {
|
|
Function.prototype.bind = function(oThis) {
|
|
var aArgs, self, FNOP, fBound;
|
|
|
|
if (typeof this !== 'function') {
|
|
throw new TypeError();
|
|
}
|
|
|
|
aArgs = Array.prototype.slice.call(arguments, 1);
|
|
|
|
self = this;
|
|
|
|
FNOP = function() {};
|
|
|
|
fBound = function() {
|
|
return self.apply(this instanceof FNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
|
|
};
|
|
|
|
if (this.prototype) {
|
|
FNOP.prototype = this.prototype;
|
|
}
|
|
|
|
fBound.prototype = new FNOP();
|
|
|
|
return fBound;
|
|
};
|
|
}
|
|
|
|
// Element.prototype.dispatchEvent
|
|
|
|
if (!window.Element.prototype.dispatchEvent) {
|
|
window.Element.prototype.dispatchEvent = function(event) {
|
|
try {
|
|
return this.fireEvent('on' + event.type, event);
|
|
} catch (err) {}
|
|
};
|
|
}
|
|
})(); |