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

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

  • 相关阅读:
    第01组 Alpha冲刺 总结
    第01组 Alpha冲刺 (6/6)
    小黄衫买家秀及获奖感言
    软工实践个人总结
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    SDN实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    实验 3:Mininet 实验——测量路径的损耗率
    2020软件工程个人编程作业一:统计分析GitHub 的用户行为数据
  • 原文地址:https://www.cnblogs.com/lxin/p/2729652.html
Copyright © 2020-2023  润新知