<style>
        #parent{ width: 600px; height: 20px; background: #ccc; position: relative; margin: 20px auto;}
        #div1{ width: 20px; height: 20px; background: red; position: absolute; left: 0; top: 0;}
        #div2{width: 400px; height: 300px; border: 1px solid black; overflow: hidden; position: relative;}
        #div3{position: absolute; left: 0; top: 0;}
    </style>
<script>
        window.onload=function(){
            var oDiv=document.getElementById("div1");
            var oDiv2=document.getElementById("div2");
            var oDiv3=document.getElementById("div3");
            var oParent=document.getElementById("parent");
            var disX=0;
            oDiv.onmousedown=function(ev){
                var oEvent=ev||event;
                disX=oEvent.clientX-oDiv.offsetLeft;
                if(oDiv.setCapture){//兼容ie9以下
                    oDiv.onmousemove=mouseMove;
                    oDiv.onmouseup=mouseUp;
                    oDiv.setCapture();
                }else{//兼容其他浏览器
                    document.onmousemove=mouseMove;
                    document.onmouseup=function(ev){
                        this.onmousemove=null;
                        this.onmouseup=null;
                    };
                }
                return false;
            };
            function mouseMove(ev){
                var oEvent=ev||event;
                var l=oEvent.clientX-disX;
                if(l<0){
                    l=0;
                }else if(l>oParent.offsetWidth-oDiv.offsetWidth){
                    l=oParent.offsetWidth-oDiv.offsetWidth;
                }
                oDiv.style.left=l+"px";

                var scale=l/(oParent.offsetWidth-oDiv.offsetWidth);
                document.title=scale*oDiv3.offsetHeight;
                oDiv3.style.top=-scale*(oDiv3.offsetHeight-oDiv2.offsetHeight)+"px";
            };
            function mouseUp(){
                this.onmousemove=null;
                this.onmouseup=null;
                if(oDiv.releaseCapture){
                    oDiv.releaseCapture();
                }
            }
        }
    </script>
<div id="parent">
        <div id="div1"></div>
    </div>
    <div id="div2">
        <div id="div3">
            前者我们详细地写了如何去操作dom节点的过程,我们命令什么,它就操作什么;
后者则是我们输入了数据状态,输出视图(我们不关心中间的过程,它们均由框架帮助我们实现);
前者固然直接,但是当应用变得复杂则代码将难以维护,而后者框架帮我们实现了一系列的操作,无需管理过程,优势显然可见。

为了实现这一点,就是实现如何输入数据,输出视图,我们就会注意到上面的render函数,render函数的实现,主要在对dom性能的优化上,当然实现方式也多种多样,直接的innerHTML、使用documentFragment、还有virtual dom,在不同场景下性能上有所不同,但是框架追求的是在大部分场景中框架已经满足你的优化需求,这里我们也不加以赘述,后文会提到。

当然还有数据变化侦测,从而re-render视图,数据变化侦测中,值得一提的是数据生产者(Producer)和数据消费者(Consumer)之间的联系,这里,我们可以暂且将系统(视图)作为一个数据的消费者,我们的代码设置数据的变化,作为数据的生产者
我们这里可以分为系统不可感知数据变化和系统可感知数据变化

Rx.js中是将两者通信分成拉取(Pull)和推送(Push),比较不好理解,这里我自己就分了个类
系统不可感知数据变化
像React/Angular这类框架并不知道数据什么时候变了,但是它视图什么时候更新呢,比如React就是通过setState发信号告诉系统有可能数据变了,然后通过virtual dom diff去渲染视图,angular则是有一个脏值检查流程,遍历比对
        </div>
相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!