文章出處

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;
        }())
    };
}());

參考

http://www.cnblogs.com/cloudgamer/


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()