Last active
December 20, 2015 03:19
-
-
Save 6174/6062438 to your computer and use it in GitHub Desktop.
avalonJS 源码里边的一些有趣片段!
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
var DONT_ENUM = "propertyIsEnumerable,isPrototypeOf,hasOwnProperty,toLocaleString,toString,valueOf,constructor".split(","); | |
var class2type = {}; | |
"Boolean Number String Function Array Date RegExp Object Error".replace(rword, function(name) { | |
class2type["[object " + name + "]"] = name.toLowerCase() | |
}); | |
//=========================================================================================================// | |
//=========================================================================================================// | |
if (/[native code]/.test(Object.getPrototypeOf)) { | |
avalon.isPlainObject = function(obj) { | |
return obj && typeof obj === "object" && Object.getPrototypeOf(obj) === oproto | |
} | |
} | |
//=========================================================================================================// | |
//=========================================================================================================// | |
//兼容ie6的slice方法 | |
var W3C = window.dispatchEvent; | |
var aslice = [].slice; | |
function resetNumber(a, n, end) { | |
if ((a === +a) && !(a % 1)) { //如果是整数 | |
if (a < 0) { | |
a = a * -1 >= n ? 0 : a + n | |
} else { | |
a = a > n ? n : a | |
} | |
} else { | |
a = end ? n : 0 | |
} | |
return a | |
} | |
var slice = W3C ? function(nodes, start, end) { | |
return aslice.call(nodes, start, end); | |
} : function(nodes, start, end) { | |
var ret = [], | |
n = nodes.length; | |
start = resetNumber(start, n) | |
end = resetNumber(end, n, 1) | |
for (var i = start; i < end; ++i) { | |
ret[i - start] = nodes[i] | |
} | |
return ret | |
}; | |
//=========================================================================================================// | |
//=========================================================================================================// | |
//这小段代码信息量好大, 插, | |
//MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力 | |
//https://developer.mozilla.org/zh-CN/docs/DOM/MutationObserver 这篇介绍还不错 | |
var BrowserMutationObserver = window.MutationObserver || window.WebKitMutationObserver; | |
if (BrowserMutationObserver) { | |
avalon.nextTick = function(callback) { | |
var input = DOC.createElement("input") | |
var observer = new BrowserMutationObserver(function(mutations) { | |
mutations.forEach(function() { | |
callback() | |
}); | |
}); | |
//设置要观察变化的DOM 对象 input | |
observer.observe(input, { | |
attributes: true | |
}); | |
input.setAttribute("value", Math.random()) | |
} | |
} else if (window.VBArray) { | |
//ie6 下面就是这样实现nextTip的么, 太有才了! | |
avalon.nextTick = function(callback) { | |
var node = DOC.createElement("script"); | |
node.onreadystatechange = function() { | |
callback() | |
node.onreadystatechange = null | |
root.removeChild(node) | |
node = null | |
}; | |
root.appendChild(node); | |
} | |
} else { | |
avalon.nextTick = function(callback) { | |
setTimeout(callback, 0) | |
} | |
} | |
//=========================================================================================================// | |
//=========================================================================================================// | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment