JS-Web-API-DOM和BOM

1、DOM节点的操作

对节点的操作的js要放在DOM结构下面,不能放在body里面,否则获取的就是null
property 只是修改属性不会影响html结构
attribute 会改变html结构
两者都可能会引起DOM结构的重新渲染

<body>
    <div id="uuu">hh</div>
    <li >1</li>
    <li class="name">2</li>
    <li class="name">3</li>
    <script>
        let a = document.getElementById('uuu')
        console.log(a)
        let b = document.getElementsByClassName('name')//集合
        console.log(b)
        let c = document.getElementsByTagName('li')//集合
        console.log(c)
        let d = document.querySelectorAll('li')//集合
        console.log(d)
        console.log(c===d)//false,这两个区别,querySelectorAll上有forEach啊这些方法
        d.forEach(i=>{
            console.log(i)
        })
        let e = d[1]
        //property 不会影响DOM结构
        e.style.height = '100px'
        console.log(e.style.height)
        //attribute 会改变DOM结构
        e.setAttribute('style','font-size:66px;')
        console.log(e.getAttribute('style'))
    </script>
</body>

2、DOM结构操作

  1. 创建元素:document.createElement(‘p’)
  2. 新增元素:father.appendChild(new)
  3. 移动元素:father.appendChild(old)
  4. 获取父元素:chlid.parentNode
  5. 获取子元素:father.childNodes;注意里面还有其他类型的节点
  6. 删除子元素:father.removeChild(child)
<body>
    <div id="uuu">
        <a href="#">hello</a>
    </div>
    <hr>
    <div id="nnn">
        <li class="move">我是移动节点</li>
        <li class="name">2</li>
        <li class="name">要被删除</li>
    </div>
    <script>
       let uuu = document.getElementById('uuu')
       let nnn = document.getElementById('nnn')
       //创建元素
       let newp = document.createElement('p')
       newp.innerHTML = '我是新增元素'
       //新增元素
       uuu.appendChild(newp)
       //移动节点
       let moveNode = document.getElementsByClassName('move')
       uuu.appendChild(moveNode[0])//新增一个存在的元素,就是移动元素
       //获取元素的父节点
       let child = document.getElementsByTagName('a')
       let a1 = child[0]
       console.log(a1.parentNode)
       //获取元素子节点
       let childs = nnn.childNodes
       console.log(childs) //这里会因该是输出2个,但是有6个,因为里面包含了其他类型的node
       childs  = Array.prototype.slice.call(childs) //把它变成一个数组
       console.log(childs instanceof Array)
       //常见的nodeType 1 => 元素 ;2 => attribute ; 3 => 文本 ;  
       childs = childs.filter(function(i){
          return i.nodeType === 1
       })
       console.log(childs)
       //删除子元素
       nnn.removeChild(childs[1])
    </script>
</body>

3、如何优化 DOM 操作的性能

我们不能频繁进行dom操作,可以将频繁操作改为一次性操作
我们不能频繁进行dom访问,可以对dom查询做缓存

<body>
    <ul id="uuu">
    </ul>
    <script>
        let ulfather = document.getElementById('uuu')
        //未优化:频繁操作dom start
        for(let  i = 0; i < 10; i++) 
        {
            let item = document.createElement('li')
            item.innerHTML = `我是${i}`
            ulfather.appendChild(item)
        }
        //未优化:频繁操作dom end

        //已优化:操作dom优化 start
        let tempNode = document.createDocumentFragment()//创建一个文本片段,此时还没有插入到dom中
        for(let  i = 10; i < 20; i++) 
        {
            let item = document.createElement('li')
            item.innerHTML = `我是${i}`
            tempNode.appendChild(item)//先插入到文本片段里面
        }
        ulfather.appendChild(tempNode)//最后一起插入dom里面去
        //已优化:操作dom优化 end

        //未优化:频繁dom查询 start
        for(let i = 0; i < document.getElementsByTagName('li').length; i++){
            console.log(i)
        }
        //未优化:频繁dom查询 end

        //已优化:缓存dom查询 start
        let hh = document.getElementsByTagName('li')
        let lengthhh = hh.length
        for(let i = 0; i < lengthhh; i++){
            console.log(i)
        }
        //已优化:缓存dom查询 end
    </script>
</body>

4、dom的数据结构

树形的数据结构

5、BOM的相关知识点

  1. 识别浏览器类型(navigator)
    const ua = navigator.userAgent;
    console.log(ua);//之后用indexof来判断
  2. 浏览器前进,后退(history)
    history.back()//后退
    history.forward()//前进
  3. screen的信息(screen)
    screen.height//屏幕高度
    screen.width//屏幕宽度
  4. 链接的信息(location)
    location.host//链接的host地址
    location.href//链接的url
    location.hash//链接的#后面的内容
    location.pathname//链接的路径
    location.search//链接的参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值