-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsetAsap.js
87 lines (72 loc) · 2.44 KB
/
setAsap.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(function (thisVar, undefined) {
'use strict';
var main = (typeof window === 'object' && window) || (typeof global === 'object' && global) ||
typeof self === 'object' && self || thisVar;
var hasSetImmediate = typeof setImmediate === 'function';
var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function';
var index = 0;
function getNewIndex() {
if (index === 9007199254740991) {
return 0;
}
return ++index;
}
var setAsap = (function () {
var hiddenDiv, scriptEl, timeoutFn, callbacks;
// Modern browsers, fastest async
if (main.MutationObserver) {
return function setAsap(callback) {
hiddenDiv = document.createElement("div");
(new MutationObserver(function() {
callback();
hiddenDiv = null;
})).observe(hiddenDiv, { attributes: true });
hiddenDiv.setAttribute('i', '1');
};
// Browsers that support postMessage
} else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) {
var MESSAGE_PREFIX = "com.setImmediate" + Math.random();
callbacks = {};
var onGlobalMessage = function (event) {
if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) {
var i = +event.data.split(':')[1];
callbacks[i]();
delete callbacks[i];
}
};
main.addEventListener("message", onGlobalMessage, false);
return function setAsap(callback) {
var i = getNewIndex();
callbacks[i] = callback;
main.postMessage(MESSAGE_PREFIX + ':' + i, "*");
};
// IE browsers without postMessage
} else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) {
return function setAsap(callback) {
scriptEl = document.createElement("script");
scriptEl.onreadystatechange = function onreadystatechange() {
scriptEl.onreadystatechange = null;
scriptEl.parentNode.removeChild(scriptEl);
scriptEl = null;
callback();
};
document.body.appendChild(scriptEl);
};
// All other browsers and node
} else {
timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout;
return function setAsap(callback) {
timeoutFn(callback);
};
}
})();
if (typeof module !== 'undefined' && module.exports) {
module.exports = setAsap;
} else if (typeof require !== 'undefined' && require.amd) {
define(function () {
return setAsap;
});
} else {
main.setAsap = setAsap;
}
})(this);