文章出處
文章列表
for Window
github: https://github.com/laixiangran/commonJS/blob/master/src/forWindow.js
代碼
/**
* Created by laixiangran on 2016/1/24
* homepage:http://www.cnblogs.com/laixiangran/
* for Window
*/
(function() {
var com = window.COM = window.COM || {};
com.$W = {
/**
* 在window.onload前執行,相當于jq的ready()
* 使用domReady.ready()將執行函數加入隊列中
**/
domReady: (function() {
// 用于添加要執行的函數
var domReady = function() {
var fnArr = Array.prototype.slice.call(arguments);
// 頁面如果加載完畢則直接運行
if (domReady.isReady) {
fnArr.forEach(function(fn) {
fn();
});
}
else {
domReady.fns = fnArr;
}
};
// 用于判定頁面是否加載完畢
domReady.isReady = false;
domReady.fns = [];
// 執行所有在window.onload之前放入的函數
domReady.fireReady = function() {
if (!domReady.isReady) {
if (!document.body) {
return setTimeout(domReady.fireReady, 16);
}
domReady.isReady = true;
if (domReady.fns.length) {
domReady.fns.forEach(function(fn) {
fn();
});
}
}
};
// 開始初始化domReady函數,判定頁面的加載情況
if (document.readyState === "complete") {
domReady.fireReady();
} else if (-[1,]) {
document.addEventListener("DOMContentLoaded", function() {
document.removeEventListener("DOMContentLoaded", arguments.callee, false);
domReady.fireReady();
}, false);
} else {
// 當頁面包含圖片時,onreadystatechange事件會觸發在window.onload之后,
// 換言之,它只能正確地執行于頁面不包含二進制資源或非常少或者被緩存時
document.attachEvent("onreadystatechange", function() {
if (document.readyState == "complete") {
document.detachEvent("onreadystatechange", arguments.callee);
domReady.fireReady();
}
});
(function(){
if (domReady.isReady) {
return;
}
// doScroll存在于所有標簽而不管其是否支持滾動條
// 這里如果用document.documentElement.doScroll(),我們需要判定其是否位于頂層document
var node = new Image();
try {
node.doScroll();
node = null; // 防止IE內存泄漏
}catch (e) {
// javascrpt最短時鐘間隔為16ms,這里取其倍數
setTimeout(arguments.callee, 64);
return;
}
domReady.fireReady();
})();
}
return domReady;
}()),
/**
* requestAnimationFrame兼容性擴展,兩方面工作:
* 1、把各瀏覽器前綴進行統一
* 2、在瀏覽器沒有requestAnimationFrame方法時將其指向setTimeout方法
* */
requestAnimationFrame: (function() {
var func = null;
var lastTime = 0;
var vendors = ["webkit", "moz"];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
func = window[vendors[x] + "RequestAnimationFrame"];
}
if (!func) {
func = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));
var id = window.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
}
return func;
}()),
// 取消AnimationFrame
cancelAnimationFrame: (function() {
var func = null;
var vendors = ["webkit", "moz"];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
// Webkit中此取消方法的名字變了
window.cancelAnimationFrame = window[vendors[x] + "CancelAnimationFrame"] || window[vendors[x] + "CancelRequestAnimationFrame"];
}
if (!func) {
func = function(id) {
window.clearTimeout(id);
};
}
return func;
}())
};
}());
參考
文章列表
全站熱搜