01. DOM的本质
  • xml是一种可扩展的标记性语言,可扩展就是可以描述任何结构的数据,他是一棵树,可以自定义标签,可以自己扩展。
  • html也是一种特定的xml,他规定了一些标签的名称,结构与xml是一样的,但是他有一些自己的规定。
  • DOM的本质是什么,是浏览器内存里面初始化之后的一个树,是从html文件里面解析出来的一棵树。
02. DOM的节点操作
  • 根据id获取元素 document.getElementById('div1')
  • 根据标签获取集合 document.getElementsByTagName('div')
  • 根据class获取集合 document.getElementsByClassName('.container')
  • 根据标签获取集合 document.querySelectorAll('p')
const pList = document.querySelectorAll('p')
const p = pList[0]
console.log(p.style.width) //获取样式
p.style.width = '100px' //修改样式
console.log(p.className) //获取class
p.className = 'p1' // 修改class // 获取nodeName 和 nodeType
console.log(p.nodeName) // 打印标签节点的名称
console.log(p.nodeType) // 节点的类型
  • property:修改对象属性,不会体现到html结构中
  • attribute:修改html属性,会改变html结构
  • 两者都有可能引起DOM重新渲染
// attribute 修改的是标签的属性
const pList = document.querySelectorAll('p')
const p = pList[0]
p.getAttribute('data-name')
p.setAttribute('data-name', 'imooc')
p.getAttribute('style')
p.setAttribute('style', 'font-size:30px')
03. DOM的结构操作
  • 新增/插入节点
  • 获取子元素列表,获取父元素
  • 删除子元素
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) // 获取父元素
console.log(p1.parentNode) // 获取子元素列表
const divChildNodes = div1.childNodes
console.log(div1.childNodes)
const div1ChildNodesP = Array.prototype.slice.call(div1.childNodes).filter(child => {
if (child.nodeType === 1){
return true
}
return false
})
console.log('div1ChildNodesP', div1ChildNodesP) // 删除子元素
div1.removeChild(div1ChildNodesP[0])
04. DOM的性能
  • DOM操作时非常昂贵的,避免频繁的DOM操作
  • 对DOM查询可以做缓存
  • 将频繁操作改为一次性操作
// 不缓存 DOM 查询结果
for (let = 0; i< document.getElementsByTagName('p').length;i++) {
// 每次循环,都会计算length,频繁进行DOM查询
} // 缓存DOM查询的结果
const pList = document.getElementsByTagName('p')
const length = pList.length
for (let i = 0; i<length;i++){
// 缓存 length,只进行一次DOM查询
} // 将频繁的操作改为一次性操作
const listNode = document.getElementById('list') // 创建一个文档片段,此时还没有插入到DOM树中
const frag = document.createDocumentFragment() // 执行插入,每次都添加到dom片段中去
for(let x=0; x<10; x++){
const li = document.createElement("li")
li.innerHTML = "List item " + x
frag.appendChild(li)
} // 都完成之后,在插入到DOM树中去
listNode.appendChild(frag)

前端面试准备笔记之JavaScript(04)的更多相关文章

  1. 前端面试准备笔记之JavaScript(03)

    01. 变量声明提升 在预解析的时候,成员变量和函数,被提升到最高的位置,方便其他程序访问. 可以先使用后声明. 只提升变量名,不提升变量值 let const 声明的变量不具有变量声明提升. // ...

  2. 前端面试准备笔记之JavaScript(02)

    01. this的典型应用场景 this在各个场景中取什么值,是在函数执行的时候确认的,不是在定义的时候确认的. 普通函数执行 返回window function fn1() { console.lo ...

  3. 前端面试准备笔记之JavaScript(01)

    1.1 typeof 能判断哪些类型? typeof可以识别所有的值类型 typeof可以识别函数 //function typeof可以判断是否是引用类型(不可以再细分) //object 1.2 ...

  4. 前端面试知识点集锦(JavaScript篇)

    目录 1.谈谈你对Ajax的理解?(概念.特点.作用) 2.说说你对延迟对象deferred的理解? 3.什么是跨域,如何实现跨域访问? 4.为什么要使用模板引擎? 5.JavaScript是一门什么 ...

  5. 问得最多的十个JavaScript前端面试问题

    我知道有很多人不同意这种类型的面试.其实不管你喜不喜欢,你都得接受.尤其当你是自学的,而且要申请第一份工作时.   我估计很多有人其它方法来证明他自己,像Github/ 项目地址可能是非常理想的证明方 ...

  6. web前端面试试题总结---javascript篇

    JavaScript 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的 ...

  7. 前端面试之JavaScript的基本数据类型!

    前端面试之JavaScript的基本数据类型! JS的基本数据类型 数字 字符串 布尔值 JavaScript中有两个特殊的原始值: null (空) 和undefined (未定义), , 它们不是 ...

  8. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  9. 前端面试之JavaScript中的闭包!

    前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...

随机推荐

  1. Python 学习笔记(下)

    Python 学习笔记(下) 这份笔记是我在系统地学习python时记录的,它不能算是一份完整的参考,但里面大都是我觉得比较重要的地方. 目录 Python 学习笔记(下) 函数设计与使用 形参与实参 ...

  2. 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫

    python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...

  3. vs2010新特性

    下面列出了一些新的功能:1.代码编辑器新的代码编辑器使代码更易于阅读.可以通过按 CTRL 并滚动鼠标轮放大文本.此外,单击 Visual C# 或 Visual Basic 中的符号时该符号的所有实 ...

  4. python的if和else语句

    1.单分支选择结构: if表达式: 语句块 2.双分支结构 if表达式: 语句块1 else: 语句块2 3.多分支结构 if 表达式1: 语句块1 elif 表达式2: 语句块2 elif 表达式3 ...

  5. 快速沃尔什变换 (FWT)学习笔记

    证明均来自xht37 的洛谷博客 作用 在 \(OI\) 中,\(FWT\) 是用于解决对下标进行位运算卷积问题的方法. \(c_{i}=\sum_{i=j \oplus k} a_{j} b_{k} ...

  6. java零基础之--【Lombok】简化类设计神器

    I1. 在类设计中我们必不可少的要进行属性定义,构造方法,setter/getter方法,toString方法定义,如果在设计项目中属性过多则会影响类的阅读性. Lombok作为第三方插件,很好的解决 ...

  7. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  8. Hbase性能调优(二)

    一.HBase关键参数配置指导 如果同时存在读和写的操作,这两种操作的性能会相互影响.如果写入导致的flush和Compaction操作频繁发生,会占用大量的磁盘IO操作,从而影响读取的性能.如果写入 ...

  9. Spring 抽象的缓存包 spring-cache

    项目实战 用户信息查询接口中,使用@Cacheable注解  绑定相关信息接口中,使用@CachePut更新用户信息到缓存 更新用户信息接口中,使用@CacheEvict删除缓存信息 使用步骤 添加依 ...

  10. 20210107 - python 的Excel自动化

    1.前置条件:用python, 开发工具pycharm 2.安装包: pip install openpyxl,  该包支持:xlsx, 但是不支持xlrd.xlwt格式的文件 3.概念介绍: 一个e ...