bigpipe之三demo出炉

了解了基本的原理后,我就开始着手进行BP模型的演练,原以为会不难,只是将一些数据动态的加载和引用。在实际的操作中,遇到了一系列的问题。

问题1:

动态加载css,如何判断动态加载的css已经加载完成?在网上找了很多 都只是简单的将link标签 创建好之后添加到head部分,这样有个问题啊,怎么判断这个对应连接的css加载完了呢,后来,曲线救国的方法。创建一个隐藏的div,在你要加载的css样式里来设置这个隐藏div的比如width属性,间隔的来查看这个样式是不是已经加上,如果加上,就说明这个对应的css样式已经加载完了 这个方面很巧妙哈,其实也可以用于判断动态加载的js是否已经加载完毕,不过对于js的是否加载完,已经有了现成的接口,只是要进行浏览器兼容性的判断。这个问题目前已经解决。

问题2:

一个pagelet也许同时对应两个或者更多个css,从原则上是可以这样的。同样,也可以对应一个或多个js文件。这个就要求,在进行页面输出的时候,对应的css和js格式应该为数组。这个问题也解决了。

另:我本来暗下决心 从这个例子开始我的注释一定要灰常灰常规范。不过还是太懒,没改进完全。

另有一个没解决的问题。即缓存的问题,比如,我修改了css文档,但刷新页面也没有看到最新的样式。我删除缓存后就可以看到最新的样式了。所以我猜想,当前的样式还是从缓存中读取的。只是,我修改了文件,所以当前文件的修改时间 和 缓存中读取到的修改时间应该不一致啊。既然不一致,为什么还是从缓存中读取呢,百思不得其解中。

好了 贴代码的时间,代码很多。先来php端的 也就是输出的页面为:

    <html>
    <head>
    <meta charset="utf-8"/>
    <title>test</title>
    </head>
    <body>
        <div id="box1" style="800px; height:200px; border:1px solid #333"></div>
        <p></p>
        <div id="box2" style="800px; height:200px; border:1px solid #333"></div>
        <script src="BP.js"></script>
        <script>
            BP.pagelet({
                id : "box1",
                css : [],
                js : ["/a/box.js"],
                html : "<span class='word'>this is test word</span>"
            })
        </script>
        <script>
            BP.pagelet({
                id : "box2",
                css : ["/a/box2.css"],
                js : ["/a/box2.js"],            
                html : "<span class='word1'>second test word</span>"
            })
        </script>
    </body>
    </html>

其中,BP是当前模式的解释语言。

BP也贴过来?

var BP =  (function(){
    var that={};
    that = {
        /**
        * check the id
        * @param {object} json.id
        */
        argsCheck : function(json){
            if(!json.id){
                throw  'nodeId is necessary';
                return;
            }
        },
        /**
        * get node by id
        * @param {string} id
        * @return {html object} html node
        */
        g : function(id){
            if (typeof id === 'string') {
                return document.getElementById(id);
            }
            else {
                return id;
            }
        },
        /**
        * check the type of broswer
        */
        IE : function(){
            return /msie/i.test(navigator.userAgent);
        },
        getStyle : function(node,property){
            var cssList;
            try {
                cssList = document.defaultView.getComputedStyle(node, null);
            } 
            catch (e) {
                cssList = node.currentStyle;
            }
            return node.style[property] || cssList[property];
        },
        /**
         * load css
         * @param {object} css href, load_ID, oncomplete
         * @param {string} css href
         * @param {string} load_ID
         * @param {function} onCssComplete
         */
        cssLoader : function(json){
            //insert css
            var len  = json.css.length;            
            json.onCssComplete =  json.onCssComplete ? json.onCssComplete : function(){};    
            if(len < 1){
                json.onCssComplete();
            }else{
                for(var i = 0; i < len; i++){
                    var link = document.createElement('link');
                    link.setAttribute('rel','stylesheet');
                    link.setAttribute('type','text/css');
                    link.setAttribute('charset','utf-8');
                    link.setAttribute('href',json.css[i]);
                    document.getElementsByTagName('head')[0].appendChild(link);
                    
                    var div = document.createElement("div");
                    div.id = json.load_ID;
                    div.style.display = "none";
                    document.body.appendChild(div);                    
                }
                var timer = setInterval(function(){
                        if(parseInt(BP.getStyle(BP.g(json.load_ID),"width")) == 40){                    
                            clearInterval(timer);
                            json.onCssComplete();
                            document.body.removeChild(div);
                        }
                                        
                    },50)
            }
                
        },
        /**
         * load js
         * @param {string} js
         */
        jsLoader : function(json){
             var len = json.js.length;
             json.onJsComplete = json.onJsComplete ? json.onJsComplete : function(){};
             
             if(len < 1){
                json.onJsComplete();
             }else{
                for(var i = 0; i < len; i++){
                    var script = document.createElement("script"); 
                     script.setAttribute("charset","utf-8");
                     script.setAttribute("src",json.js[i]);
                     document.getElementsByTagName("head")[0].appendChild(script);
                     
                     if(i == len-1){ //判断最后一个js文件是否已经加载完
                        if(BP.IE){
                            script["onreadystatechange"] = function(){
                                if(script.readystatechange.toLowerCase() == "loaded" || script.readystatechange.toLowerCase() == "complete"){
                                    json.onJsComplete();
                                }
                            }
                         }else{
                            script.onload = function(){
                                json.onJsComplete();
                            }
                         }
                     }
                }
                
             }                  
        },
        pagelet : function(json){
            BP.argsCheck(json);
            
            var cssJson = {
                css : json.css,
                load_ID : json.id + "css",
                onCssComplete : function(){
                    // load css first;
                    if(json.html){
                        BP.g(json.id).innerHTML = json.html;
                    }
                }
            }
            BP.cssLoader(cssJson);
            
            var jsJson  = {
                js : json.js,
                onJsComplete : function(){
                    console.log(json.id + '----complete');
                }
            }
            BP.jsLoader(jsJson);
        }
    }
    return that;
})();

自己执行了下 是可以的 很有成就感的一次探索,但愿关于缓存的问题我能早点找到答案。

原文地址:https://www.cnblogs.com/lxin/p/2729652.html