什么是DOM

文档对象模型(Document Object Model),DOM作用:可以去修改网页内容、样式、结构。 每个浏览器都会把html文档解析成dom树,就可以用相关方法和属性操作网页元素

DOM节点

什么是节点?节点之间的关系?

  • 根节点:html, 也叫祖先节点
  • 父节点
  • 子节点
  • 兄弟节点

节点类型

元素节点 1
文本节点 3
文档节点 9
注释节点 8
  1. <div id='box'>heboan</div>
  2. <div id='box2'><!--这是注释--></div>
  3.  
  4. <script>
  5. oBox = document.getElementById('box')
  6. console.log(oBox.nodeType) //1 元素节点
  7. console.log(oBox.firstChild.nodeType) //3 oBox的第一个子节点是heboan,这是个文本节点
  8. console.log(document.nodeType) //9 文档节点
  9.  
  10. oBox2 = document.getElementById('box2')
  11. console.log(oBox2.firstChild.nodeType) //8 注释节点
  12.  
  13. </script>

nodeType获取节点类型

节点类型使用场景

  1. <ul id='ul1'>
  2. <li>1111</li>
  3. <li>2222</li>
  4. <li>3333</li>
  5. </ul>
  6.  
  7. <script>
  8. //需求,点击document,修改li的背景色
  9. var oUl1 = document.getElementById('ul1');
  10. //通过节点的方式找li,childNodes返会所有子节点
  11. var aNodes = oUl1.childNodes
  12. document.onclick = function(){
  13. for(var i=0;i<aNodes.length;i++){
  14. aNodes[i].style.backgroundColor = "red"
  15. }
  16. }
  17.  
  18. </script>

这行上面代码是会报错的,这是为什么呢?

我们console.log(aNodes)看看,发现有7个对象,我们不是只有3个li吗???

这是因为,它识别到空格为text了

所以,这个时候,我们就可以利用节点类型进行过滤了

  1. <script>
  2. //需求,点击document,修改li的背景色
  3. var oUl1 = document.getElementById('ul1');
  4. //通过节点的方式找li,childNodes返会所有子节点
  5. var aNodes = oUl1.childNodes
  6. console.log(aNodes)
  7. document.onclick = function(){
  8. for(var i=0;i<aNodes.length;i++){
  9. if(aNodes[i].nodeType == 1){ //判断节点类型
  10. aNodes[i].style.backgroundColor = "red"
  11. }
  12. }
  13. }
  14. </script>

节点名的使用场景

  1. <ul id='ul1'></ul>
  2. <input id='ipt' />
  3. <button id="btn">按钮</button>
  4.  
  5. <script>
  6. var oUl = document.getElementById('ul1');
  7. var oIpt = document.getElementById('ipt');
  8. var oBtn = document.getElementById('btn');
  9.  
  10. oBtn.onclick = function(){
  11. //创建一个li对象
  12. var oLi = document.createElement('li');
  13. oLi.innerHTML = oIpt.value;
  14. oUl.appendChild(oLi);
  15. }
  16.  
  17. //点击新添加的li有背景变化
  18. oUl.onclick = function(ev){
  19. //当我们点击的事li才设置颜色,如果点击的是ul就不做操作
  20. if(ev.target.nodeName === 'LI'){
  21. ev.target.style.backgroundColor = "#009F95";
  22. }
  23. }
  24. </script>

nodeName使用场景

上面的代码的如果不做nodeName判断,那么就会出现bug,点击到ul,会导致整个ul变色

查找元素方法

getElement系列

  getElementById :id来获取

  getElementsByClassName: 通过类名称来获取

  getElementsByTagName: 通过标签名来获取

  总结:凡是Element带s,就表示返回的事一个集合

  通过设置范围,查找相应的元素

    document.getElementById

    obj.getElementById

querySelector系列

查找 wrap下面的所有的div

  1. <script>
  2. var oWrap = document.getElementById('wrap')
  3. var aDiv = oWrap.getElementsByTagName('div')
  4. console.log(aDiv)
  5. </script>

getElement写法

  1. <script>
  2. var oDiv = document.querySelectorAll('#wrap div')
  3. console.log(oDiv)
  4. </script>

querySelector写法

  1. <script>
  2. var oBox = document.querySelector('#box')
  3. console.log(oBox)
  4. </script>

querySelector查找id为box的元素

querySelectorAll返回有的符合条件的,querySelector只返回某一个

总结:两者的区别,getElement执行效率更高,查找起来相对麻烦些

常用的属性

childnodes  获取所有子节点

  1. <div id="wrap">
  2. <div>111111</div>
  3. <div>222222</div>
  4. <div>333333</div>
  5. <div>444444</div>
  6. </div>
  7.  
  8. <script>
  9. //根据方法获取节点
  10. var oWrap = document.getElementById('wrap')
  11.  
  12. //根据属性获取节点
  13. console.log(oWrap.childNodes) //获取oWrap所有的子节点
  14. </script>

获取oWrap所有的子节点

可以看到所有子节点包含了空格(文本节点),如果只想获取所有的子元素节点,可以使用children

children  获取所有的子元素节点

  1. <div id="wrap">
  2. <div>111111</div>
  3. <div>222222</div>
  4. <div>333333</div>
  5. <div>444444</div>
  6. </div>
  7.  
  8. <script>
  9. //根据方法获取节点
  10. var oWrap = document.getElementById('wrap')
  11.  
  12. //根据属性获取节点
  13. console.log(oWrap.children) //获取oWrap所有的子节点
  14. </script>

获取oWrap所有的子元素节点

parentNode获取父节点

  1. <div id="wrap">
  2. <div>111111</div>
  3. <div id=box>222222</div>
  4. <div>333333</div>
  5. <div>444444</div>
  6. </div>
  7.  
  8. <script>
  9. var oWrap = document.getElementById('wrap')
  10.  
  11. console.log(oWrap.parentNode) //获取 oWrap的父节点
  12. </script>

获取 oWrap的父节点

previousSibling获取上一个兄弟节点

  1. <div id="wrap">
  2. <div>111111</div><div id=box>222222</div><div>333333</div><div>444444</div>
  3. </div>
  4.  
  5. <script>
  6. var oBox = document.getElementById('box')
  7.  
  8. console.log(oBox.previousSibling) //获取 oBox的上一个兄弟节点
  9. </script>

获取 oBox的上一个兄弟节点

nextSibling获取下一个兄弟节点

  1. <div id="wrap">
  2. <div>111111</div><div id=box>222222</div><div>333333</div><div>444444</div>
  3. </div>
  4.  
  5. <script>
  6. var oBox = document.getElementById('box')
  7.  
  8. console.log(oBox.nextSibling) //获取 oBox的上一个兄弟节点
  9. </script>

获取 oBox的上一个兄弟节点

DOM操作

createElement 创建一个元素

appendChild   添加一个子元素在最后

  1. <ul id='uL1'></ul>
  2. <button id="btn">click</button>
  3.  
  4. <script>
  5. var oUL1 = document.getElementById('uL1')
  6. var oBtn = document.getElementById('btn')
  7.  
  8. oBtn.onclick = function(){
  9. //创建一个li元素
  10. var oLi = document.createElement('li')
  11. oLi.innerHTML = 'heboan'
  12.  
  13. //把创建的li元素添加到ul中
  14. oUL1.appendChild(oLi)
  15. }
  16. </script>

示例

inertBefore 在一个元素钱插入元素

  1. <ul id='uL1'>
  2. <li>11111</li>
  3. <li id=l2>22222</li>
  4. <li>11111</li>
  5. </ul>
  6. <button id="btn">click</button>
  7.  
  8. <script>
  9. var oUL1 = document.getElementById('uL1')
  10. var oBtn = document.getElementById('btn')
  11. var oL2 = document.getElementById('l2')
  12.  
  13. oBtn.onclick = function(){
  14. //创建一个li元素
  15. var oLi = document.createElement('li')
  16. oLi.innerHTML = 'heboan'
  17.  
  18. //在oL2元素前面插入oLi
  19. oUL1.insertBefore(oLi, oL2)
  20. }
  21. </script>

insertBefore

removeChild 删除一个子元素

  1. <ul id='uL1'>
  2. <li>11111</li>
  3. <li id=l2>22222</li>
  4. <li>11111</li>
  5. </ul>
  6. <button id="btn">click</button>
  7.  
  8. <script>
  9. var oUL1 = document.getElementById('uL1')
  10. var oBtn = document.getElementById('btn')
  11. var oL2 = document.getElementById('l2')
  12.  
  13. oBtn.onclick = function(){
  14. //删除一个子元素
  15. oUL1.removeChild(oL2)
  16.  
  17. }
  18. </script>

removeChild

宽、高和位置总结

鼠标位置:

  • clientX/clientY   鼠标在浏览器可视区的坐标
  • pageX/pageY: 鼠标在整个网页中的坐标

  1. <body style="height: 3000px;">
  2.  
  3. <script>
  4. document.onclick = function(ev){
  5. console.log(ev.clientX, ev.clientY)
  6. console.log('------------')
  7. console.log(ev.pageX, ev.pageY)
  8. }
  9. </script>
  10.  
  11. </body>

鼠标位置

offset系列

  • offsetLeft offsetTop 是相对于定位父级的坐标位置
  • offsetWidth offsetHeight 是元素实体所占的总宽高,例如:总宽度=内容 + padding +border
  • offsetParent 表示定位的父级元素
  1. <style>
  2. #box{
  3. width: 600px;
  4. height: 400px;
  5. border: 1px solid black;
  6. position: relative;
  7. margin: 100px auto;
  8. }
  9.  
  10. #box-inner{
  11. width: 50px;
  12. height: 60px;
  13. background-color: green;
  14. border: 5px solid deeppink;
  15. padding: 10px;
  16. position: absolute;
  17. left: 100px;
  18. top: 100px
  19. }
  20. </style>
  21.  
  22. ...
  23. <body>
  24.  
  25. <div id="box">
  26. <div id=box-inner></div>
  27. </div>
  28.  
  29. <script>
  30. var oBoxInner = document.getElementById('box-inner')
  31.  
  32. document.onclick = function(){
  33. //盒子的定位偏移量,是相对于定位父级的坐标位置
  34. console.log("offsetLeft:" + oBoxInner.offsetLeft) //
  35. console.log("offsetTop:" + oBoxInner.offsetTop) //
  36.  
  37. //offsetWidth表示盒子占的总宽度=border = width + padding
  38. console.log("offsetWidth:" + oBoxInner.offsetWidth) //
  39.  
  40. //offsetHeight表示盒子占的总宽度=border = height + padding
  41. console.log("offsetHeight:" + oBoxInner.offsetHeight) //
  42.  
  43. //offsetParent 表示定位的父级元素
  44. console.log("offsetParent:" + oBoxInner.offsetParent.id) //打印出父级元素的id为 box
  45. }
  46. </script>
  47.  
  48. </body>

offset系列

scroll系列

  • scrollLeft和scrollTop 表示元素滚出去的距离
  • scrollWidth和scrollHeight 对象的实际内容的宽高,会随对象中内容超过可视区后而变大
  1. <style>
  2. #box{
  3. width: 300px;
  4. height: 150px;
  5. border: 1px solid black;
  6. margin: 100px auto;
  7. padding: 10px;
  8. margin: 20px;
  9. /*表示溢出隐藏, 里面的盒子比这个盒子高,高的部分会被隐藏,从而出现滚动条*/
  10. overflow: auto;
  11. }
  12.  
  13. #box-inner{
  14. width: 290px;
  15. height: 400px;
  16. background-color: orangered;
  17. margin: 0 auto;
  18. }
  19. </style>
  20. ...
  21. <body>
  22.  
  23. <div id="box">
  24. <div id=box-inner></div>
  25. </div>
  26.  
  27. <script>
  28. var oBox = document.getElementById('box')
  29.  
  30. document.onclick = function(){
  31. //滚出去的距离
  32. console.log("scrollTop: " + oBox.scrollTop)
  33. console.log("scrollLeft: " + oBox.scrollLeft)
  34.  
  35. //内部实际占的宽度和高度
  36. console.log("scrollWidth: " + oBox.scrollWidth) //
  37. console.log("scrollHeight: " + oBox.scrollHeight) //
  38. }
  39. </script>
  40.  
  41. </body>

sroll系列

可视区宽高

  • clientWidth
  • clientHeight
  1. <style>
  2. #box{
  3. width: 300px;
  4. height: 200px;
  5. border: 1px solid black;
  6. padding: 10px;
  7. }
  8.  
  9. </style>
  10. ...
  11.  
  12. <body>
  13.  
  14. <div id="box"></div>
  15.  
  16. <script>
  17. var oBox = document.getElementById('box')
  18.  
  19. oBox.onclick = function(){
  20. //可视区的宽高:包含width和padding
  21. console.log(this.clientWidth) //
  22. console.log(this.clientHeight) //
  23.  
  24. //offsetWidth/offsetHeight(包含width_padding_border)
  25. console.log(this.offsetWidth)
  26. console.log(this.offsetHeight)
  27. }
  28. </script>
  29.  
  30. </body>

可视区宽高

client和offset区别: client不加border,offset加border

文档可视区宽高以及滚动距离计算(重要)

  1. <body style="height: 2000px;">
  2. <script>
  3. //获取文档相关
  4. //document是一个对象,对象没有宽高,必须要获取到html元素才有宽高
  5. //document.documentElement 获取到的是整个html页面
  6.  
  7. //1 获取文档可视区的宽高
  8. console.log(document.documentElement.clientWidth)
  9. console.log(document.documentElement.clientHeight)
  10.  
  11. //2 获取页面宽高
  12. console.log(document.documentElement.scrollWidth)
  13. console.log(document.documentElement.scrollHeight)
  14.  
  15. // 3如何获取滚动距离
  16. console.log(document.documentElement.scrollTop)
  17. console.log(document.documentElement.scrollLeft)
  18. //注意以上上问题时非常常用的,必须记住
  19. </script>
  20. </body>

文档可视区宽高以及滚动距离计算

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6.  
  7. <style>
  8. #wrap{
  9. width: 100%;
  10. height: 500px;
  11. background-color: rgb(0,0,0,0.5);
  12. position: fixed;
  13. left: 0;
  14. top: 0;
  15. display: none;
  16. }
  17.  
  18. #box{
  19. width: 300px;
  20. height: 300px;
  21. background-color: white;
  22. position: absolute;
  23. left: 0;
  24. top: 0;
  25.  
  26. }
  27.  
  28. h1 {
  29. background-color: #009F95;
  30. font-size: 16px;
  31. color: white;
  32. }
  33. </style>
  34.  
  35. </head>
  36.  
  37. <body style="height: 2000px;">
  38. <!--需求:点击按钮 弹窗遮罩-->
  39. <button id="btn">click</button>
  40. <div id="wrap">
  41. <div id="box">
  42. <h1>登录</h1>
  43. </div>
  44. </div>
  45. <p style="margin-top: 1500px;">11111</p>
  46.  
  47. <script>
  48. var oBtn = document.getElementById('btn')
  49. var oWrap = document.getElementById('wrap')
  50. var oBox = document.getElementById('box')
  51. oBtn.onclick = function(){
  52. //让wrap显示
  53. oWrap.style.display = 'block'
  54.  
  55. var pageH = document.documentElement.scrollHeight
  56. oWrap.style.height = pageH + 'px'
  57.  
  58. //让登录box居中显示,设置left和top
  59. var dleft = document.documentElement.clientWidth/2 - oBox.offsetWidth/2
  60. var dtop = document.documentElement.clientHeight/2 - oBox.offsetHeight/2
  61. //如果 dtop是负值,要重置为0
  62. if(dtop <0 ){
  63. dtop = 0
  64. }
  65.  
  66. oBox.style.left = dleft + 'px'
  67. oBox.style.top = dtop + 'px'
  68.  
  69. window.onresize = function(){
  70. //让登录box居中显示,设置left和top
  71. var dleft = document.documentElement.clientWidth/2 - oBox.offsetWidth/2
  72. var dtop = document.documentElement.clientHeight/2 - oBox.offsetHeight/2
  73. //如果 dtop是负值,要重置为0
  74. if(dtop <0 ){
  75. dtop = 0
  76. }
  77.  
  78. oBox.style.left = dleft + 'px'
  79. oBox.style.top = dtop + 'px'
  80. }
  81.  
  82. }
  83. oWrap.onclick = function(){
  84. this.style.display = 'none'
  85. }
  86. </script>
  87. </body>
  88.  
  89. </html>

应用案例

什么是BOM

BOM(Browse Object Model),浏览器对象模型,没有相关标准,是约定成俗的东西,定义了一些浏览器的方法和属性,大部分方法都是通过window对象来调用的,window对象是浏览器最顶层的对象。

  DOM: 操作文档

  BOM: 操作浏览器

  1. <body>
  2. <button id="btn1">打开</button>
  3. <button id="btn2">关闭</button>
  4.  
  5. <script>
  6. var oBtn1 = document.getElementById('btn1')
  7. var oBtn2 = document.getElementById('btn2')
  8. var w = null
  9.  
  10. oBtn1.onclick = function(){
  11. //打开一个窗口,如果没有指定网址,则打开一个空白窗口
  12. //第2个参数,是打开窗口的方式,不写默认是新开一个窗口,self是在本页面跳转
  13. //返回的是新开窗口的对象
  14. w = open('https://www.baidu.com')
  15. //open('https://www.baidu.com', '_self')
  16. }
  17.  
  18. oBtn2.onclick = function(){
  19. //关闭之前打开的窗口
  20. w.close()
  21. }
  22.  
  23. </script>
  24. </body>

open和close方法

BOM相关属性

  1. <script>
  2. console.log(window.navigator.userAgent)
  3. //Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
  4.  
  5. if(window.navigator.userAgent.indexOf("MSIE") != -1){
  6. alert('当前浏览器是IE')
  7. }else{
  8. alert('当前浏览器器不是IE')
  9. }
  10. </script>

查看浏览器信息

  1. //得到访问的地址
  2. console.log(window.location.href)
  3.  
  4. //得到地址栏问号后面的东西 ?wd='xx'&age=12
  5. console.log(window.location.search)
  6.  
  7. //得到地址栏#号后面的内容
  8. console.log(window.location.hash)

地址栏相关

第9天-BOM和DOM的更多相关文章

  1. BOM,DOM,ECMAScripts三者的关系

    一:DOM 文档对象模型(DOM)是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口(API) DOM是HTML与JavaScript之间沟通的桥梁.   DOM下,HTM ...

  2. BOM和DOM的区别和关联

    BOM 1. BOM是Browser Object Model的缩写,即浏览器对象模型. 2. BOM没有相关标准. 3. BOM的最根本对象是window. 从1可以看出来:BOM和浏览器关系密切. ...

  3. 实现JavaScript的组成----BOM和DOM

    我们知道,一个完整的JavaScript的实现,需要由三部分组成:ECMAScript(核心),BOM(浏览器对象模型),DOM(文档对象模型). 今天主要学习BOM和DOM. BOM: BOM提供了 ...

  4. BOM和DOM详解

    DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...

  5. JS中的函数、Bom、DOM及JS事件

    本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...

  6. 从零开始的JS生活(二)——BOM、DOM与JS中的事件

    上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...

  7. 前端之BOM和DOM

    BOM和DOM简介 BOM(Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”. DOM(Document Object Model)是指 ...

  8. BOM和DOM的区别

    一.BOM和DOM之间的关系图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象由于window是顶层对象,因此调用它的子对象时可以不显示的指明 ...

  9. 前端基础之BOM和DOM

    关于网页交互:BOM和DOM javaScript分为ECMAScript,DOM,BOM . BOM(Browser  object  Model)是指浏览器对象模型,它使JavaScript有能力 ...

  10. 前端基础之BOM和DOM(响应式布局、计时器、搜索框、select联动)

    一.BOM和DOM JavaScript分为 ECMAScript,DOM,BOM. BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进 ...

随机推荐

  1. Codeforces 148 D Bag of mice

    D. Bag of mice http://codeforces.com/problemset/problem/148/D time limit per test 2 seconds memory l ...

  2. unZip/Zip的安装

    1.apt-get安装: apt-get install zip 2.yum安装: yum install -y unzip zip

  3. 重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)

    客户通过一个委托类来调用另一个对象.在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机:封装即使不是对象的最关机特性,也是最关机特性之一.“封装”意味着每个对象都应该少了解系统的其他部分.如此 ...

  4. asp.net实现access数据库分页

    最近在编程人生上看到篇文章很有感触,觉得人生还是要多奋斗.今天给大家贡献点干货. <divclass="page"id="ctrlRecordPage"& ...

  5. 引用类型 ( 对象定义 )——Function 类型

    本文地址:http://www.cnblogs.com/veinyin/p/7607798.html  函数实际上是对象,也具有属性和方法,函数名实际上是指向函数对象的指针 function sum( ...

  6. laravel前台html代码不显示

    后天向前台传输变量,如果能取到变量数据,还有代码,但是不显示图片 可以把{{}}换成{!!     !!}试试.

  7. tf.name_scope tf.variable_scope学习

    1. 首先看看比较简单的 tf.name_scope(‘scope_name’). tf.name_scope 主要结合 tf.Variable() 来使用,方便参数命名管理. ''' Signatu ...

  8. Hbuilder连接第3方模拟器(夜神)

    http://www.bcty365.com/content-146-5148-1.html

  9. Neuroph studio 入门教程

    PERCEPTRON Perceptron is a simple two layer neural network with several neurons in input layer, and ...

  10. netif_receive_skb->__netif_receive_skb_core

    在设备驱动收包之后,会通过netif_receive_skb将收取的包,按照注册的协议回调,传递到上层进行处理: /* 将skb传递到上层 */ static int __netif_receive_ ...