web優化之-js 異步加載 js延遲執行 js插件

最近因工做的須要主要作web前段的優化,其中之一就是js的優化,在項目中的js代碼相對比較規範的,都是$(function(){})這種格 式。可是你們都知道js的下載比較耗時的,它的解析和執行是阻塞式的。咱們是否能夠先讓js下載下來,在windows的load事件中在去解析和執行 了。答案是確定的,其中ControlJS .js就實現了這種方式。我的以爲它比LAB的延遲加載要優秀的一點,減小了js的加載時間。可是該js功能相對比較強大,同時也沒有解決js依賴關係的加載。我的本身寫了一個小插件 來實現js異步加載延遲執行。
javascript

代碼以下: html

(function () {
    var document = window.document;
    var getAttribute = function (elem, name) {
        var attrs = elem.attributes;
        var len = attrs.length;
        for (var i = 0; i < len; i++) {
            var attr = attrs[i];
            if (name === attr.nodeName) {
                return attr.nodeValue;
            }
        } java

        return undefined;
    }; node

    var scriptsData;
    var orders = [];
    var findScripts = function () {
        var aScripts = document.getElementsByTagName('script');
        var len = aScripts.length;
        var scriptsArr = [];
        var scriptsSrc = []; jquery

        for (var i = 0; i < len; i++) {
            var script = aScripts[i];
            if ("text/asynjs" === getAttribute(script, "type") && "undefined" === typeof (script.founded)) {
                script.founded = true;
                var order = getAttribute(script, "order") || getAttribute(script, "data-order") || 0;
                script.order = order;
                if (orders.indexOf(order) < 0) {
                    orders.push(order);
                }
                var src = getAttribute(script, "asynsrc") || getAttribute(script, "data-asynsrc");
                script.src = src;
                if (src && scriptsSrc.indexOf(src) < 0) {
                    scriptsArr.push(script);
                }
            } web

        }
        orders.sort(function compare(a, b) { return a - b; });
        return scriptsData = scriptsArr;
    };
    var downloadScripts = function (scriptArr) {
        var scripts = scriptArr || findScripts();
        var len = scripts.length; windows

        for (var i = 0; i < len; i++) {
            var img = new Image();
            img.src = scripts[i].src;
            img.style.display = "none";
        }
    }; jquery插件

    var processScripts = function (scriptArr) {
        var scripts = (scriptArr && scriptArr.constructor === Array) ? scriptArr : scriptsData;
        var len = scripts.length;
        var failscripts = [];
        var wdata = [];
        for (var i = orders.length - 1; i >= 0; i--) {
            var order = orders[i];
            var urls = [];
            var fns = [];
            for (var j = 0, len = scripts.length; j < len; j++) {
                var script = scripts[j];
                if (script.order == order) {
                    urls.push(script.src);
                }
            }
            if (i == orders.length - 1) {
                wdata[order] = processScript(urls)
            }
            else {
                var nextorder = orders[i + 1];
                fns.push(wdata[nextorder]);
                wdata[order] = processScript(urls, fns);
            }
        }
        var exorder = orders[0]
        wdata[orders[0]]();
    };
    var processScript = function (urls, fn) {
        return function () {
            for (var i = 0; i < urls.length; i++) {
                var se = document.createElement('script');
                if (fn && fn[i]) {
                    se.onload = se.onreadystatechange = fn[i];
                }
                se.src = urls[i];
                var s1 = document.getElementsByTagName('script')[0];
                s1.parentNode.insertBefore(se, s1);
            }
        }
    } 異步

    if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", function () { downloadScripts(); }, false);
        window.addEventListener("load", function () { setTimeout(processScripts, 0); }, false); ide

    } else if (document.attachEvent) {

        document.attachEvent("onreadystatechange", function () { downloadScripts(); });
        window.attachEvent("onload", function () { setTimeout(processScripts, 0); });
    }

})();

調用代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>test</title>
    <script type="text/javascript" src="Scripts/asynload.js"></script>
</head>
<body>
    <div id="container">
        <img src="images/bmw_m1_hood.jpg" width="765" height="574" alt="BMW M1 Hood">

        <script type="text/asynjs" order="3" asynsrc="test.js"></script>
        <script type="text/asynjs" order="1" asynsrc="Scripts/jquery-1.7.2.js"></script>
        <script type="text/asynjs" order="2" asynsrc="Scripts/jquery.lazyload.js"></script>

        <img src="images/bmw_m1_side.jpg" width="765" height="574" alt="BMW M1 Side" />
        <img data-original="images/viper_1.jpg" width="765" height="574" alt="Viper 1" />
        <img data-original="images/viper_corner.jpg" width="765" height="574" alt="Viper Corner" />
        <img data-original="images/bmw_m3_gt.jpg" width="765" height="574" alt="BMW M3 GT" />
        <img data-original="images/corvette_pitstop.jpg" width="765" height="574" alt="Corvette Pitstop" />
    </div>
</body>
</html>

IE9下執行結果:

firefox的執行結果:

其中jquery.lazyload.js是圖片延遲加載的jquery插件。test.js的代碼$(function () {$("img[data-original]").lazyload();});。

相關文章
相關標籤/搜索