快速搞定前端JS面试 -- 第六章 JS-Web-API-DOM

  1. DOM的本质

  2. DOM节点操作

  3. DOM结构操作

  4. DOM性能

一、DOM的本质


Xml是一种可扩展的标记语言,可以描述任何一种结构的数据

Html是一种特定的xml,结构和xml相同,但规定了标签的名称规范

DOM的本质是从html解析出来的一棵树

dom 演示

一段文字 1

一段文字 2

一段文字 3

    二、DOM节点操作


    1.获取DOM节点

    2. Property

    3. Attribute

    const div1 = document.getElementById(‘div1’)

    console.log(‘div1’, div1)

    const divList = document.getElementsByTagName(‘div’) // 集合

    console.log(‘divList.length’, divList.length)   // 2

    console.log(‘divList[1]’, divList[1])     // 第二个div

    const containerList = document.getElementsByClassName(‘container’) // 集合

    console.log(‘containerList.length’, containerList.length)   // 2

    console.log(‘containerList[1]’, containerList[1])    // 第二个div

    const pList = document.querySelectorAll(‘p’)    // css选择器

    console.log(‘pList’, pList)

    const pList = document.querySelectorAll(‘p’)

    const p1 = pList[0]

    // property 形式,修改JS变量的属性,不会对标签产生影响

    p1.style.width = ‘100px’

    console.log( p1.style.width )     // 获取样式:100px

    p1.className = ‘red’

    console.log( p1.className )     // 获取className:red

    console.log(p1.nodeName)     // p

    console.log(p1.nodeType)     // 1类型

    // attribute形式,修改了标签的属性

    p1.setAttribute(‘data-name’, ‘imooc’)

    console.log( p1.getAttribute(‘data-name’) )

    p1.setAttribute(‘style’, ‘font-size: 50px;’)

    console.log( p1.getAttribute(‘style’) )

    Property和attribute

    Property:修改对象属性,不会体现到html结构中

    Attribute:修改html属性,会改变html结构

    两者都有可能引起DOM重新渲染

    (使用建议:尽量用property操作,如果必须要改变标签结构时使用attribute)

    一些常用的 HTML DOM 方法

    getElementById(id) - 获取带有指定 id 的节点(元素)

    appendChild(node) - 插入新的子节点(元素)

    removeChild(node) - 删除子节点(元素)

    一些常用的 HTML DOM 属性:

    innerHTML - 节点(元素)的文本值

    parentNode - 节点(元素)的父节点

    childNodes - 节点(元素)的子节点

    attributes - 节点(元素)的属性节点

    三、DOM结构操作


    1. 新增/插入节点

    2. 获取子元素列表,获取父元素

    3. 删除子元素

    const div1 = document.getElementById(‘div1’)

    const div2 = document.getElementById(‘div2’)

    // 新建节点

    const newP = document.createElement(‘p’)

    newP.innerHTML = ‘this is newP’

    // 插入节点

    div1.appendChild(newP)

    // 移动节点

    const p1 = document.getElementById(‘p1’)

    div2.appendChild(p1)   // p1被移动到div2里

    // 获取父元素

    console.log( p1.parentNode )    // div2

    // 获取子元素列表

    const div1ChildNodes = div1.childNodes

    console.log( div1.childNodes )      // 7(包含4 text和3 p)

    const div1ChildNodesP = Array.prototype.slice.call(div1.childNodes).filter(child => {

    if (child.nodeType === 1) {    // 判断是否是

    的DOM节点

    return true

    }

    return false

    })

    console.log(‘div1ChildNodesP’, div1ChildNodesP)

    // 删除节点

    div1.removeChild( div1ChildNodesP[0] )

    方法

    描述

    getElementById()

    返回带有指定 ID 的元素。

    getElementsByTagName()

    返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。

    getElementsByClassName()

    返回包含带有指定类名的所有元素的节点列表。

    appendChild()

    把新的子节点添加到指定节点。

    removeChild()

    删除子节点。

    replaceChild()

    替换子节点。

    insertBefore()

    在指定的子节点前面插入新的子节点。

    createAttribute()

    创建属性节点。

    createElement()

    创建元素节点。

    createTextNode()

    创建文本节点。

    getAttribute()

    返回指定的属性值。

    setAttribute()

    把指定属性设置或修改为指定的值。

    四、DOM性能


    DOM操作非常‘昂贵’(占用CPU,可能会造成浏览器重排,耗时),因此尽量避免频繁的DOM操作;

    对DOM查询做缓存(减少DOM操作);

    将频繁操作改为一次性操作;

    1. DOM查询做缓存

    2. 将频繁操作改为一次性操作

    // 操作:在list下插入多个list-item

    const list = document.getElementById(‘list’)

    // 创建一个文档片段,此时还没有插入到 DOM 结构中

    const frag = document.createDocumentFragment()

    for (let i  = 0; i < 20; i++) {

    const li = document.createElement(‘li’)

    li.innerHTML = List item ${i}

    // list.appendChild(li)违反频繁操作DOM准则,应该把每次插入作为一个整体,进行一次插入操作

    // 插入文档片段中

    frag.appendChild(li)

    }

    // 都完成之后,再统一插入到 DOM 结构中

    list.appendChild(frag)

    最后

    四轮技术面+一轮hr面结束,学习到了不少,面试也是一个学习检测自己的过程,面试前大概复习了 一周的时间,把以前的代码看了一下,字节跳动比较注重算法,面试前刷了下leetcode和剑指offer, 也刷了些在牛客网上的面经。大概就说这些了,写代码去了~

    祝大家都能收获大厂offer~

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

    篇幅有限,仅展示部分内容

    • 27
      点赞
    • 10
      收藏
      觉得还不错? 一键收藏
    • 1
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值