BOM+DOM

219 阅读6分钟

BOM

概念:
    BOM:browser object model的缩写 --浏览器对象模型-使用由对线组成的结构操作浏览器
navigator --存储浏览器信息
🚩history -- 操作浏览器的历史记录:
        history.back()  -- 后退一个页面
        history.forward() -- 前进一个页面
        history.go() -- 前进或后退多个页面:
                                        正数是前进
                                        负数是后退
                                        前进后退几个页面,就看数字是几
🚩location -- 操作地址栏url:
        herf:
            设置完整的地址 -- location.href=新地址
            获取完整的地址 -- location.href
        search:
            设置地址栏参数 -- location.search=?键=值&键=值
            获取地址栏参数 -- location.search
        hash:
            设置锚点 -- location.hash=#单词
            获取锚点 -- location.hash
  窗口大小:包含了滚动条的宽和高
      innerWidth  
      innerHeight 
🚩浏览器专属事件:
            window.onload -- 当所有资源加载完成后,触发执行
            window.onresize -- 当浏览器窗口大小发生改变,触发执行
            window.onscroll -- 当浏览器卷去的距离发生改变,触发执行
   浏览器的方法:
            弹出层:
                   alert
                   confirm
                   prompt
            全局定义的函数,都是属于window的方法
            全局定义的变量,都是属于window的属性
        
    🚩🚩🚩定时器:
        
            语法:
                周期性定时器:setInterval(函数,毫秒数) -- 让函数每隔多少毫秒数,就执行一次,会不停的执行下去
            语法:
                一次性定时器:setTimeout(函数,毫秒数) -- 让函数延迟毫秒数执行一次,就这一次
            共同点:
                返回值:
                    都代表当前页面中的第几个定时器 -- 数字
                停止定时器:
                    使用返回值:
                        clearInterval(返回值)
                        clearTimeout(返回值)
            打开新的标签页 -- window.open(url)
            设置卷去的距离 -- window.scrollTo(x,y)
            关闭窗口 -- window.close()                

DOM

    概念:
        DOM:document object model的缩写 -- 文档对象模型-由对象组成的结构操作html文档
    查找元素:
            🚩document.querySelector(css选择器) -- 获取满足css选择器的第一个标签 -- 返回一个标签
            🚩document.querySelectorAll(css选择器) -- 获取所有满足css选择器的标签 -- 返回一个集合
            注意:不能对着集合直接进行操作
            document.getElementById() -- 通过id去查找元素
            document.getElementsByClassName() -- 通过class类名去查找元素 
            document.getElementsByTagName() -- 通过标签名去查找元素
    获取html基本结构标签:
            HTML -- document.documentElement
          🚩body -- document
            head -- document.head
            网页标题 -- document.title:
                                可以获取标题
                                可以设置标题
    🚩获取标签名:
                标签.tagName
    🚩操作内容:
            双标签:
                文本内容:
                    设置 -- 标签.innerText=值
                    获取 -- 标签.innerText
                带标签的内容:
                    设置 -- 标签.innerHTML=值
                    获取 -- 标签.innerHTML
            表单:
                设置 -- 标签.value=值
                获取 -- 标签.value
    🚩操作属性:
            设置属性 -- 标签.setAttribute(属性名,值)
            获取属性 -- 标签.getAttribute(属性名)
            删除属性 -- 标签.removeAttribute(属性名)
    样式操作:
            获取样式 -- getComputedStyle(标签) - 返回由所有css键值对组成的对象
          🚩设置样式 -- 标签.style.css键=值 - 设置到行内
    🚩类名操作:
            直接操作class属性值:
                    标签.className=值
                    标签.className
            classList:
                    add() -- 添加一个类名
                    remove() -- 删除一个类名
                    contains() -- 判断是否有这个类名
                    toggle() -- 让类名在删除和添加之间切换
    🚩获取卷去的距离:
            有文档声明:
                    var t=document.documentElement.scrollTop
            没有文档声明:
                    var t=document.body.scrollTop
            具有兼容性 - 兼容性写法:
                    var t=document.documentElement.scrollTop||document.body.scrollTop
            可以赋值 
    🚩短路运算:
            使用逻辑运算符 &&|| 给变量进行赋值:
                    var 变量=1&&2:
                            如果左边为true,就会将右边的值赋值给变量
                            如果左边为false,就会将左边的值赋值给变量
                    var 变量=1||2:
                            如果左边为true,就会将左边的值赋值给变量
                            如果左边为false,就会将右边的值赋值给变量
    🚩获取节点:
            概念:
                DOM就是html结构中一个一个节点构成的,不光标签是一个节点,文本内容也是一个节点,注释,包括空格都是节点
            DOM节点分三种:
                元素节点、文本节点、属性节点、。元素节点就是我们获取到的标签元素;标签里面的文本就是文本节点,标签上的属性就是属性节点
            获取节点:
                语法:
                    父标签.children -- 所有子标签节点 - 获取到的是一个所有子标签组成的伪数组
                    父标签.firstElementChild -- 第一个子标签节点
                    父标签.lastElementChild -- 最后一个子标签节点
                    子标签.parentElement -- 父标签节点
                    标签.previouseElementSibling -- 前面一个兄弟标签节点
                    标签.nextElementSibling -- 后面一个兄弟标签节点
    创建标签:
            语法:
                document.createElement('标签名字符串')
                例:
                    var div=document.createElement('div')
    插入节点:
            语法:
                给父标签追加子标签:
                        父标签.appendChild(子标签对象)
                        例:
                            body.appendChild(div)
                将新的子标签插入到某个旧的子标签前面:
                        父标签.insertBefore(新的子标签,旧的子标签)
                        例:
                            div.insertBefore(.box,.big)
    替换节点:
            语法:
                使用新的子标签替换掉旧的子标签:
                        父标签.removeChild(新的子标签,旧的子标签)
                        例:
                            div.removeChild(.box,.big)
    删除节点:
            语法:
                父标签将指定的子标签删除:
                        父.removeChild(子标签)
                        例:
                            body.removeChild(.box)
    克隆节点:
            语法:
                将一个标签复制一份出来:
                        标签.cloneNode() -- 返回一个标签对象,这样只能复制一个空的标签,没有内容。
                        例:
                            div.cloneNode('div')
                返回一个标签对象,这样只能复制一个空的标签,没有内容
                        标签.cloneNode(true) --返回一个标签对象,这样可以将标签中的内容也复制出来。
    获取标签尺寸:
            语法:
                包含标签边框的尺寸:
                    标签.offsetWidth
                    标签.offsetHeight
                    例:
                        var w=div.offsetWidth
                        var h=div.offsetHeight
                     console.log(w,h)
                 不包含标签边框的尺寸:
                    标签.clientWidth
                    标签.clientHeight
                    例:
                        var w=div.clientWidth
                        var h=div.clientHeight
                     console.log(w,h)
             -- 返回纯数字 -- 
    获取元素位置:
            语法:
                标签.offsetLeft
                标签.offsetTop
                例:
                    var L=div.offsetLeft
                    var T=div.offsetTop
                    console.log(L,T)
            -- 获取的是相对于设置过定位的父标签的左边距和上边距,返回纯数字 --
    获取边框大小:
            语法:
                标签.clientTop
                标签.clientLeft
                例:
                   var L=div.clientLeft
                   var T=div.clientTop 
                   console.log(L,T)
           -- 获取到的是上边框和左边框的厚度,返回纯数字 --   

回流和重绘

```
    浏览器渲染过程:                              
            浏览器会先解析html成DOM树,同时解析css成样式规则 
            将DOM树和css规则合成渲染树              
            计算标签关系、位置、大小                
            给标签涂颜色                        
            让浏览器显示
    回流:
            如果动态操作了标签的节点、位置、大小,浏览器需要重新计算标签的大小和位置,也就造成了回流
    重绘:
            如果动态操作了标签的颜色等属性,就需要重新喷绘,也就造成了重绘 
    -- 无论回流和重绘都影响了浏览器的渲染性能 --
    优化:
            合并样式修改
            例:
                var oDiv = document.querySelector('.box');
                oDiv.style.padding = '5px';
                oDiv.style.border = '1px solid #000';
                oDiv.style.margin = '5px';
            解决:使用style的cssText:
                oDiv.style.cssText = 'padding:5px; border:1px solid #000; margin:5px;';
            减少批量的dom操作
            例:
                    var data = [
                    {
                        id:1,
                        name:"商品1",
                    },
                    {
                        id:2,
                        name:"商品1",
                    },
                    {
                        id:3,
                        name:"商品1",
                    },
                    {
                        id:4,
                        name:"商品1",
                    },
                    // 假设后面还有很多
                ];
                var oUl = document.querySelector("ul");
                for(var i=0;i<data.length;i++){
                    var oLi = document.createElement("li");
                    oLi.innerText = data[i].name;
                    oUl.appendChild(oLi);
                }
            解决:
                方法1:方法一:隐藏ul后,给ul添加节点,添加完成后再将ul显示
                oUl.style.display = 'none';
                    for(var i=0;i<data.length;i++){
                        var oLi = document.createElement("li");
                        oLi.innerText = data[i].name;
                        oUl.appendChild(oLi);
                    }
                    oUl.style.display = 'block';
                    
                    
               方法二:创建文档碎片,将所有li先放在文档碎片中,等都放进去以后,再将文档碎片放在ul中 
               var fragment = document.createDocumentFragment();
                        for(var i=0;i<data.length;i++){
                            var oLi = document.createElement("li");
                            oLi.innerText = data[i].name;
                            fragment.appendChild(oLi);
                        }
                        oUl.appendChild(fragment);
                        
                        
               方法三:将ul拷贝一份,将所有li放在拷贝中,等都放进去以后,使用拷贝替换掉ul
               var newUL = oUl.cloneNode(true);
                    for(var i=0;i<data.length;i++){
                        var oLi = document.createElement("li");
                        oLi.innerText = data[i].name;
                        newUL.appendChild(oLi);
                    }
                    oUl.parentElement.replaceChild(newUl, oUl);
                    
                    
                
            优化定时器中的dom操作
            例:
                goBack.onclick = function(){
                    setInterval(function(){
                        var t = document.documentElement.scrollTop || document.body.scrollTop;
                        t += 10;
                        document.documentElement.scrollTop = document.body.scrollTop = t;
                    },20)
                }
            解决:只获取一次,每次都让数字递增,避免每次都获取滚动过的距离
                goBack.onclick = function(){
                        var t = document.documentElement.scrollTop || document.body.scrollTop;
                        setInterval(function(){
                            t += 10;
                            document.documentElement.scrollTop = document.body.scrollTop = t;
                        },20)
                    }
            
```