zoukankan      html  css  js  c++  java
  • 如何渲染数据

    渲染数据

      数据渲染:

        字符串拼接    dom创建   模板    文档碎片

      Dom回流:

        每当对dom元素进行增删改的时候,浏览器就会重新加载一个,把新的结果渲染出来;

      案例:ul 下面有三个 li  ,每个 li 有一个onmouseover事件;

      1,字符串拼接(最常用)

        var list = document.querySelector( " . list " )

        var li = document.querySelectorAll( " li " )

        for (var i=0 ; i < li . length ; i ++){

            li [i] . onmousemove = function(){

              this.style.background="red"

            }

            li [i] . onmouseout= function(){

              this.style.background=" "

            }

         }

        var data=[ "aaa" , "bbb" , "ccc" ]

        var st=" "

        for(var m=0; m<data.length; m++){

            st+="<li>"

              st+=data[m]

            st+="</li>

        }

        list.innerHTML + = st ;

        优点:

          只进行了一次DOM回流;

        缺点:

          原有dom事件都会丢失;

        原因:

          就在于innerHTML这个属性,这个属性是返回或设置dom中的内容,以字符串形式返回,拼接完之后是string类型,

          而onmouse这些属性是dom元素身上的,所以这些onmouse系列的属性就丢失了;

      2,DOM拼接:

        var list = document . querySelector(" . list " )

        var li = document . querySelectorAll(" li ")

        for (var i=0 ; i < li . length ; i ++){

            li [i] . onmousemove = function(){

              this.style.background="red"

            }

            li [i] . onmouseout= function(){

              this.style.background=" "

            }

         }

        var data=[ "aaa" , "bbb" , "ccc" ]

        for(var m=0; m < data . length ; m++){

            var lis = document . createElement(“ li ”)

            lis . innerHTML= data[m]

            list . appendchild(lis)

        }

        优点:

          原有的dom身上的事件不会丢失,不影响其他dom

        缺点:

          dom回流次数过多,严重影响网页性能

      3,模板:

          他的本质就是字符串拼接;

      4,文档碎片:

          var list = document . querySelector(" . list " )

          var li = document . querySelectorAll(" li ")

          for (var i=0 ; i < li . length ; i ++){

              li [i] . onmousemove = function(){

                this.style.background="red"

              }

              li [i] . onmouseout= function(){

                this.style.background=" "

              }

           }

            var data=[ "aaa" , "bbb" , "ccc" ]

            var frag = createDocumentFrament()

            for(var m = 0; m < data. length ; m++){

                var lis = document.createElement(“li”)

                lis . innerHTML = data [ m]

                frag.appendchild (lis)

            }

            list.appendchild  (frag)

        *事件委托:

          利用事件冒泡原理

          无论上面四种方法,新增的li没有onmouseover事件,

          如果保证新增的 li 也拥有添加事件,用dom遍历添加事件是不行的,用事件委托;

          

            

  • 相关阅读:
    iOS 根据生日计算生肖
    iOS 生日计算星座
    iOS App设置icon,启动图
    iOS UITextFiled基本解析
    自定义tabbaritem上的badeg
    iOS摄像头和相册-UIImagePickerController-浅析
    C++ 类型转换操作与操作符重载 operator type() 与 type operator()
    c++中的强制转换
    啊里巴巴上市--马云的励志话
    争--转任志强
  • 原文地址:https://www.cnblogs.com/xiaotaiyangye/p/10530472.html
Copyright © 2011-2022 走看看