第9天-BOM和DOM
什么是DOM
文档对象模型(Document Object Model),DOM作用:可以去修改网页内容、样式、结构。 每个浏览器都会把html文档解析成dom树,就可以用相关方法和属性操作网页元素
DOM节点
什么是节点?节点之间的关系?
- 根节点:html, 也叫祖先节点
- 父节点
- 子节点
- 兄弟节点
节点类型
元素节点 | 1 |
文本节点 | 3 |
文档节点 | 9 |
注释节点 | 8 |
<div id='box'>heboan</div>
<div id='box2'><!--这是注释--></div> <script>
oBox = document.getElementById('box')
console.log(oBox.nodeType) //1 元素节点
console.log(oBox.firstChild.nodeType) //3 oBox的第一个子节点是heboan,这是个文本节点
console.log(document.nodeType) //9 文档节点 oBox2 = document.getElementById('box2')
console.log(oBox2.firstChild.nodeType) //8 注释节点 </script>
nodeType获取节点类型
节点类型使用场景
<ul id='ul1'>
<li>1111</li>
<li>2222</li>
<li>3333</li>
</ul> <script>
//需求,点击document,修改li的背景色
var oUl1 = document.getElementById('ul1');
//通过节点的方式找li,childNodes返会所有子节点
var aNodes = oUl1.childNodes
document.onclick = function(){
for(var i=0;i<aNodes.length;i++){
aNodes[i].style.backgroundColor = "red"
}
} </script>
这行上面代码是会报错的,这是为什么呢?
我们console.log(aNodes)看看,发现有7个对象,我们不是只有3个li吗???
这是因为,它识别到空格为text了
所以,这个时候,我们就可以利用节点类型进行过滤了
<script>
//需求,点击document,修改li的背景色
var oUl1 = document.getElementById('ul1');
//通过节点的方式找li,childNodes返会所有子节点
var aNodes = oUl1.childNodes
console.log(aNodes)
document.onclick = function(){
for(var i=0;i<aNodes.length;i++){
if(aNodes[i].nodeType == 1){ //判断节点类型
aNodes[i].style.backgroundColor = "red"
}
}
}
</script>
节点名的使用场景
<ul id='ul1'></ul>
<input id='ipt' />
<button id="btn">按钮</button> <script>
var oUl = document.getElementById('ul1');
var oIpt = document.getElementById('ipt');
var oBtn = document.getElementById('btn'); oBtn.onclick = function(){
//创建一个li对象
var oLi = document.createElement('li');
oLi.innerHTML = oIpt.value;
oUl.appendChild(oLi);
} //点击新添加的li有背景变化
oUl.onclick = function(ev){
//当我们点击的事li才设置颜色,如果点击的是ul就不做操作
if(ev.target.nodeName === 'LI'){
ev.target.style.backgroundColor = "#009F95";
}
}
</script>
nodeName使用场景
上面的代码的如果不做nodeName判断,那么就会出现bug,点击到ul,会导致整个ul变色
查找元素方法
getElement系列
getElementById :id来获取
getElementsByClassName: 通过类名称来获取
getElementsByTagName: 通过标签名来获取
总结:凡是Element带s,就表示返回的事一个集合
通过设置范围,查找相应的元素
document.getElementById
obj.getElementById
querySelector系列
查找 wrap下面的所有的div
<script>
var oWrap = document.getElementById('wrap')
var aDiv = oWrap.getElementsByTagName('div')
console.log(aDiv)
</script>
getElement写法
<script>
var oDiv = document.querySelectorAll('#wrap div')
console.log(oDiv)
</script>
querySelector写法
<script>
var oBox = document.querySelector('#box')
console.log(oBox)
</script>
querySelector查找id为box的元素
querySelectorAll返回有的符合条件的,querySelector只返回某一个
总结:两者的区别,getElement执行效率更高,查找起来相对麻烦些
常用的属性
childnodes 获取所有子节点
<div id="wrap">
<div>111111</div>
<div>222222</div>
<div>333333</div>
<div>444444</div>
</div> <script>
//根据方法获取节点
var oWrap = document.getElementById('wrap') //根据属性获取节点
console.log(oWrap.childNodes) //获取oWrap所有的子节点
</script>
获取oWrap所有的子节点
可以看到所有子节点包含了空格(文本节点),如果只想获取所有的子元素节点,可以使用children
children 获取所有的子元素节点
<div id="wrap">
<div>111111</div>
<div>222222</div>
<div>333333</div>
<div>444444</div>
</div> <script>
//根据方法获取节点
var oWrap = document.getElementById('wrap') //根据属性获取节点
console.log(oWrap.children) //获取oWrap所有的子节点
</script>
获取oWrap所有的子元素节点
parentNode获取父节点
<div id="wrap">
<div>111111</div>
<div id=box>222222</div>
<div>333333</div>
<div>444444</div>
</div> <script>
var oWrap = document.getElementById('wrap') console.log(oWrap.parentNode) //获取 oWrap的父节点
</script>
获取 oWrap的父节点
previousSibling获取上一个兄弟节点
<div id="wrap">
<div>111111</div><div id=box>222222</div><div>333333</div><div>444444</div>
</div> <script>
var oBox = document.getElementById('box') console.log(oBox.previousSibling) //获取 oBox的上一个兄弟节点
</script>
获取 oBox的上一个兄弟节点
nextSibling获取下一个兄弟节点
<div id="wrap">
<div>111111</div><div id=box>222222</div><div>333333</div><div>444444</div>
</div> <script>
var oBox = document.getElementById('box') console.log(oBox.nextSibling) //获取 oBox的上一个兄弟节点
</script>
获取 oBox的上一个兄弟节点
DOM操作
createElement 创建一个元素
appendChild 添加一个子元素在最后
<ul id='uL1'></ul>
<button id="btn">click</button> <script>
var oUL1 = document.getElementById('uL1')
var oBtn = document.getElementById('btn') oBtn.onclick = function(){
//创建一个li元素
var oLi = document.createElement('li')
oLi.innerHTML = 'heboan' //把创建的li元素添加到ul中
oUL1.appendChild(oLi)
}
</script>
示例
inertBefore 在一个元素钱插入元素
<ul id='uL1'>
<li>11111</li>
<li id=l2>22222</li>
<li>11111</li>
</ul>
<button id="btn">click</button> <script>
var oUL1 = document.getElementById('uL1')
var oBtn = document.getElementById('btn')
var oL2 = document.getElementById('l2') oBtn.onclick = function(){
//创建一个li元素
var oLi = document.createElement('li')
oLi.innerHTML = 'heboan' //在oL2元素前面插入oLi
oUL1.insertBefore(oLi, oL2)
}
</script>
insertBefore
removeChild 删除一个子元素
<ul id='uL1'>
<li>11111</li>
<li id=l2>22222</li>
<li>11111</li>
</ul>
<button id="btn">click</button> <script>
var oUL1 = document.getElementById('uL1')
var oBtn = document.getElementById('btn')
var oL2 = document.getElementById('l2') oBtn.onclick = function(){
//删除一个子元素
oUL1.removeChild(oL2) }
</script>
removeChild
宽、高和位置总结
鼠标位置:
- clientX/clientY 鼠标在浏览器可视区的坐标
- pageX/pageY: 鼠标在整个网页中的坐标
<body style="height: 3000px;"> <script>
document.onclick = function(ev){
console.log(ev.clientX, ev.clientY)
console.log('------------')
console.log(ev.pageX, ev.pageY)
}
</script> </body>
鼠标位置
offset系列
- offsetLeft offsetTop 是相对于定位父级的坐标位置
- offsetWidth offsetHeight 是元素实体所占的总宽高,例如:总宽度=内容 + padding +border
- offsetParent 表示定位的父级元素
<style>
#box{
width: 600px;
height: 400px;
border: 1px solid black;
position: relative;
margin: 100px auto;
} #box-inner{
width: 50px;
height: 60px;
background-color: green;
border: 5px solid deeppink;
padding: 10px;
position: absolute;
left: 100px;
top: 100px
}
</style> ...
<body> <div id="box">
<div id=box-inner></div>
</div> <script>
var oBoxInner = document.getElementById('box-inner') document.onclick = function(){
//盒子的定位偏移量,是相对于定位父级的坐标位置
console.log("offsetLeft:" + oBoxInner.offsetLeft) //
console.log("offsetTop:" + oBoxInner.offsetTop) // //offsetWidth表示盒子占的总宽度=border = width + padding
console.log("offsetWidth:" + oBoxInner.offsetWidth) // //offsetHeight表示盒子占的总宽度=border = height + padding
console.log("offsetHeight:" + oBoxInner.offsetHeight) // //offsetParent 表示定位的父级元素
console.log("offsetParent:" + oBoxInner.offsetParent.id) //打印出父级元素的id为 box
}
</script> </body>
offset系列
scroll系列
- scrollLeft和scrollTop 表示元素滚出去的距离
- scrollWidth和scrollHeight 对象的实际内容的宽高,会随对象中内容超过可视区后而变大
<style>
#box{
width: 300px;
height: 150px;
border: 1px solid black;
margin: 100px auto;
padding: 10px;
margin: 20px;
/*表示溢出隐藏, 里面的盒子比这个盒子高,高的部分会被隐藏,从而出现滚动条*/
overflow: auto;
} #box-inner{
width: 290px;
height: 400px;
background-color: orangered;
margin: 0 auto;
}
</style>
...
<body> <div id="box">
<div id=box-inner></div>
</div> <script>
var oBox = document.getElementById('box') document.onclick = function(){
//滚出去的距离
console.log("scrollTop: " + oBox.scrollTop)
console.log("scrollLeft: " + oBox.scrollLeft) //内部实际占的宽度和高度
console.log("scrollWidth: " + oBox.scrollWidth) //
console.log("scrollHeight: " + oBox.scrollHeight) //
}
</script> </body>
sroll系列
可视区宽高
- clientWidth
- clientHeight
<style>
#box{
width: 300px;
height: 200px;
border: 1px solid black;
padding: 10px;
} </style>
... <body> <div id="box"></div> <script>
var oBox = document.getElementById('box') oBox.onclick = function(){
//可视区的宽高:包含width和padding
console.log(this.clientWidth) //
console.log(this.clientHeight) // //offsetWidth/offsetHeight(包含width_padding_border)
console.log(this.offsetWidth)
console.log(this.offsetHeight)
}
</script> </body>
可视区宽高
client和offset区别: client不加border,offset加border
文档可视区宽高以及滚动距离计算(重要)
<body style="height: 2000px;">
<script>
//获取文档相关
//document是一个对象,对象没有宽高,必须要获取到html元素才有宽高
//document.documentElement 获取到的是整个html页面 //1 获取文档可视区的宽高
console.log(document.documentElement.clientWidth)
console.log(document.documentElement.clientHeight) //2 获取页面宽高
console.log(document.documentElement.scrollWidth)
console.log(document.documentElement.scrollHeight) // 3如何获取滚动距离
console.log(document.documentElement.scrollTop)
console.log(document.documentElement.scrollLeft)
//注意以上上问题时非常常用的,必须记住
</script>
</body>
文档可视区宽高以及滚动距离计算
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title> <style>
#wrap{
width: 100%;
height: 500px;
background-color: rgb(0,0,0,0.5);
position: fixed;
left: 0;
top: 0;
display: none;
} #box{
width: 300px;
height: 300px;
background-color: white;
position: absolute;
left: 0;
top: 0; } h1 {
background-color: #009F95;
font-size: 16px;
color: white;
}
</style> </head> <body style="height: 2000px;">
<!--需求:点击按钮 弹窗遮罩-->
<button id="btn">click</button>
<div id="wrap">
<div id="box">
<h1>登录</h1>
</div>
</div>
<p style="margin-top: 1500px;">11111</p> <script>
var oBtn = document.getElementById('btn')
var oWrap = document.getElementById('wrap')
var oBox = document.getElementById('box')
oBtn.onclick = function(){
//让wrap显示
oWrap.style.display = 'block' var pageH = document.documentElement.scrollHeight
oWrap.style.height = pageH + 'px' //让登录box居中显示,设置left和top
var dleft = document.documentElement.clientWidth/2 - oBox.offsetWidth/2
var dtop = document.documentElement.clientHeight/2 - oBox.offsetHeight/2
//如果 dtop是负值,要重置为0
if(dtop <0 ){
dtop = 0
} oBox.style.left = dleft + 'px'
oBox.style.top = dtop + 'px' window.onresize = function(){
//让登录box居中显示,设置left和top
var dleft = document.documentElement.clientWidth/2 - oBox.offsetWidth/2
var dtop = document.documentElement.clientHeight/2 - oBox.offsetHeight/2
//如果 dtop是负值,要重置为0
if(dtop <0 ){
dtop = 0
} oBox.style.left = dleft + 'px'
oBox.style.top = dtop + 'px'
} }
oWrap.onclick = function(){
this.style.display = 'none'
}
</script>
</body> </html>
应用案例
什么是BOM
BOM(Browse Object Model),浏览器对象模型,没有相关标准,是约定成俗的东西,定义了一些浏览器的方法和属性,大部分方法都是通过window对象来调用的,window对象是浏览器最顶层的对象。
DOM: 操作文档
BOM: 操作浏览器
<body>
<button id="btn1">打开</button>
<button id="btn2">关闭</button> <script>
var oBtn1 = document.getElementById('btn1')
var oBtn2 = document.getElementById('btn2')
var w = null oBtn1.onclick = function(){
//打开一个窗口,如果没有指定网址,则打开一个空白窗口
//第2个参数,是打开窗口的方式,不写默认是新开一个窗口,self是在本页面跳转
//返回的是新开窗口的对象
w = open('https://www.baidu.com')
//open('https://www.baidu.com', '_self')
} oBtn2.onclick = function(){
//关闭之前打开的窗口
w.close()
} </script>
</body>
open和close方法
BOM相关属性
<script>
console.log(window.navigator.userAgent)
//Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 if(window.navigator.userAgent.indexOf("MSIE") != -1){
alert('当前浏览器是IE')
}else{
alert('当前浏览器器不是IE')
}
</script>
查看浏览器信息
//得到访问的地址
console.log(window.location.href) //得到地址栏问号后面的东西 ?wd='xx'&age=12
console.log(window.location.search) //得到地址栏#号后面的内容
console.log(window.location.hash)
地址栏相关
第9天-BOM和DOM的更多相关文章
- BOM,DOM,ECMAScripts三者的关系
一:DOM 文档对象模型(DOM)是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口(API) DOM是HTML与JavaScript之间沟通的桥梁. DOM下,HTM ...
- BOM和DOM的区别和关联
BOM 1. BOM是Browser Object Model的缩写,即浏览器对象模型. 2. BOM没有相关标准. 3. BOM的最根本对象是window. 从1可以看出来:BOM和浏览器关系密切. ...
- 实现JavaScript的组成----BOM和DOM
我们知道,一个完整的JavaScript的实现,需要由三部分组成:ECMAScript(核心),BOM(浏览器对象模型),DOM(文档对象模型). 今天主要学习BOM和DOM. BOM: BOM提供了 ...
- BOM和DOM详解
DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...
- JS中的函数、Bom、DOM及JS事件
本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...
- 从零开始的JS生活(二)——BOM、DOM与JS中的事件
上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...
- 前端之BOM和DOM
BOM和DOM简介 BOM(Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”. DOM(Document Object Model)是指 ...
- BOM和DOM的区别
一.BOM和DOM之间的关系图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象由于window是顶层对象,因此调用它的子对象时可以不显示的指明 ...
- 前端基础之BOM和DOM
关于网页交互:BOM和DOM javaScript分为ECMAScript,DOM,BOM . BOM(Browser object Model)是指浏览器对象模型,它使JavaScript有能力 ...
- 前端基础之BOM和DOM(响应式布局、计时器、搜索框、select联动)
一.BOM和DOM JavaScript分为 ECMAScript,DOM,BOM. BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进 ...
随机推荐
- CF851 C 暴力
给出n个5维下的点,求点a不与其它任意的b,c重合,向量ab,ac的夹角都为钝角,这样的点个数,并打印它们. 转换二维下的求角度的函数为五维的,而且由于要求角度大于90度,在二维情况下最多有4个点,也 ...
- Keras学习笔记1--基本入门
""" 1.30s上手keras """ #keras的核心数据结构是“模型”,模型是一种组织网络层的方式,keras 的主要模型是Sequ ...
- Spring Session加Redis
session是一个非常常见的概念.session的作用是为了辅助http协议,因为http是本身是一个无状态协议.为了记录用户的状态,session机制就应运而生了.同时session也是一个非常老 ...
- HDU 1711 Number Sequence (字符串处理 KMP)
题目链接 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...
- python作业购物车(第二周)
一.作业需求: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4 ...
- 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(2)
我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...
- 宋牧春: Linux设备树文件结构与解析深度分析(1) 【转】
转自:https://mp.weixin.qq.com/s/OX-aXd5MYlE_YoZ3p32qWA 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...
- MySQL指定使用某个索引查询语句
查询语句查询emp_no,所以先查询emp_no的索引使用primary select emp_no,salary from salaries use index(s_f_t) where emp_n ...
- 在Linux上安装pycharm
1.首先在官网下载pycharm并进行提取,将提取的文件夹放在/usr下面(或者任意位置) 2.然后vi /etc/hosts 编辑 将0.0.0.0 account.jetbrains.com添加到 ...
- ioctl socket getsockopt
一 ioctl 函数产生原因: 虽然在文件操作结构体"struct file_operations"中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数.如CD-RO ...