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)

最新文章

  1. css实现网页表格
  2. Oracle基本查询语言
  3. 一个关于Random算法的问题
  4. FFmpeg-20160422-snapshot-bin
  5. Android笔记:管理所有活动
  6. java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51
  7. XML 文档和数据
  8. 转 Android中shape中的属性大全
  9. Reads sequentially from multiple sources
  10. POJ 1308 Is It A Tree? (并查集)
  11. 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?
  12. Java SE (3) 之 事件监听
  13. c/c++关于内存分配的知识(非常详细的比较,且VirtualAlloc分配内直接在进程的地址空间中保留一快内存)
  14. 微软将Bing变开放平台 同谷歌争夺开发者
  15. NGINX压力测试
  16. vs2013中集成Git
  17. Spring之JDBCTemplate学习
  18. viewer.js使用
  19. memcached小试牛刀
  20. msf辅助模块的应用——20145301

热门文章

  1. 图解HTTP权威指南(二)| 连接管理
  2. 7.自定义ViewGroup-下滑抽屉
  3. Spring-步入Spring旅途
  4. day113:MoFang:种植园商城页面&amp;充值集成Alipay完成支付的准备工作
  5. spring mvc与mybatis事务整合
  6. 一次MySQL死锁的排查记录
  7. JAVA JVM助记符
  8. Spring boot启动时报 java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long错误
  9. Java基础经典案例
  10. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页