BOM浏览器对象模型、DOM文档对象模型
一、BOM浏览器对象模型
BOM —— Browser Object Model 浏览器对象模型
BOM 的顶级对象时 winodw (是一个对象,当你打开一个页面的时候就有一个 window )
你在群居定义的所有变量都在 window 下。
1.浏览器的窗口尺寸
指的是 浏览器 可视窗口的尺寸。
浏览器有可能会出现滚动条
在一般浏览器,滚动条算浏览器的一部分
在 MAC 上,是不算的。
innerHeight 和 innerWidth 属性包含滚动条的尺寸
1.1 获取浏览器的高度
innerHeight
console.log(window.innerHeight)
//window 可省略不写
//console.log(innerHeight)
1.2 获取浏览器的宽度
innerWidth
console.log(window.innerWidth)
//window 可省略不写
// console.log(innerWidth)
2.浏览器的弹出层
在 BOM 里面,给我们提供了三个弹出层
三者的共同点:
会阻断程序的继续执行
因为 JS 是单线程
如果用户没有点击按钮表示当前弹出层没有结束
直到用户操作以后,才会继续向下执行代码
2-1 alert() 警告框
弹出一段提示文本
只有一个确定按钮
语法: window.alert(‘提示文本’)
返回值: undefined
var res = windoe.alert('画上佳人纱')
console.log(res)
2-2 confirm() 选择框
弹出一段提示文本
有确定和取消两个按钮
语法: window.confirm(‘提示文本’)
返回值: 布尔值
当用户点击确定的时候,时 true
当用户点击取消的时候,就是 false
var res = windwo.confirm('画上佳人纱')
console.log('res')
2-3 prompt() 输入框
弹出一个提示文本
有一个 input 输入框
有确定和取消按钮
语法: window.prompt(‘提示文本’)
返回值:
如果用户点击确定,那么就是文本框里面的内容
如果用户点击取消,那么就是 null
var res = window.prompt('画上佳人纱')
console.log(res)
3.浏览器的地址栏
3-1 地址栏包含哪些内容
http://www.baidu.com?a=100&b=200#abc
传输协议: http
作用: 前后端交互的方式
域名: www.baidu.com
作用: 找到一台服务器电脑
查询字符串: ?a=100&b=200
不影响你打开这个页面
作用: 打开这个页面的时候携带的信息
哈希(hash): #abc
作用: 锚点定位
3-2 location对象
window 下有一个成员叫做 location 。
location 是一个对象,里面存储着和网页地址栏内容相关的信息。
(1)hash
哈希值
作用: 锚点定位
(2) href
地址栏信息
读: 获取当前地址栏地址
写: 修改当前地址栏地址(跳转页面)
(3) search
查询字符串
作用: 来到该页面的时候携带的一些信息
3-3 reload()方法
语法: window.location.reload()
作用: 重新加载当前页面
相当于按下了浏览器左上角的刷新按钮
注意: 不能写在打开页面就能执行的地方
4.浏览器的历史记录
操作浏览器的前进后退
window 下有一个叫做 history 的成员,是一个对象,里面包含了一些操作历史记录的属性和方法。
4-1 back()
语法: window.history.back()
作用: 回退到上一条历史记录。
前提: 你需要有历史记录,不然没得回退。
4-2 forward()
语法: window.history.forward()
作用: 前进到下一条历史记录。
前提: 你需要回退过以后才可以操作。
4-3 go()
语法: window.history.go(整数)
正整数: 表示前进
0 : 表示刷新当前页面
负整数: 表示后退
5.浏览器的版本信息
window 下有一个叫做 navigator 的成员,是一个对象,里面存储这浏览器的版本信息。
5-1 userAgent
表示浏览器的版本信息及型号信息
console.log(window.navigator.userAgent)
5-2 appName
所有浏览器都是统一的名字 netscape
IE 高版本浏览器也是 netscape
IE 低版本不是
console.log(window.navigator.appName)
5-3 platform
表示浏览器所在的操作系统
console.log(window.navigator.platform)
6.浏览器的常见事件
6-1 window.onload = function () {}
页面所有资源加载完毕后执行
作用: JS 前置
当你需要把 JS 代码写在 head 标签里面的时候,最好在后面加上一个 window.onload
window.onload = function () {
console.log('资源加载完毕')
}
6-2 window.onscroll = function () {}
浏览器滚动条滚动的时候触发
不管横向还是纵向,只要滚动就触发
作用:
- 楼层导航
- 顶部通知栏和回到顶部按钮的提示
- 渐近显示页面
- 瀑布流
window.onscroll = function () {
console.log('滚动条再滚动')
}
6-3 window.onresize = function () {}
浏览器可视窗口改变的时候触发
只要改变就会触发
一般结合 innerWidth 和 innerHeight 来判断屏幕尺寸
移动端: 横屏
响应式布局: 判断窗口大小
window.onresize = function () {
console.log('浏览器可视窗口改变大小了')
}
7.浏览器卷去的高度和宽度
当页面比窗口宽或者高的时候,会有一部分是随着滚动被隐藏的
我们管 上面隐藏的叫做 卷去的高度
我们管 左边隐藏的叫做 卷去的宽度
7-1 获取卷去的高度
(1)document.documentElement.scrollTop
使用必须要有 DOCTYPE 标签
window.onscroll = function () {
console.log('html', document.documentElement.scrollTop)
}
滚动滚动条的时候,页面的高度被隐藏起来了,打印出来的就是隐藏的高度
(2)document.body.scrollTop
使用必须没有 DOCTYPE 标签
window.onscroll = function () {
console.log('body', document.body.scrollTop)
}
(3)兼容写法
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
=> || 当作短路表达式使用的 或
-> 当前面为 true 的时候, 那么就直接返回前面的值
-> 当前面为 false 的时候, 那么就返回后面的值, 不管后面是不是 false
window.onscroll = function () {
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
console.log(scrollTop)
}
7-2 获取卷去的宽度
(1)document.documentElement.scrollLeft
使用必须要有 DOCTYPE 标签
window.onscroll = function () {
console.log('有 ', document.documentElement.scrollLeft)
}
(2)document.body.scrollLeft
使用必须没有 DOCTYPE 标签
window.onscroll = function () {
console.log('没有 ', document.body.scrollLeft)
}
(3)兼容写法
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
=> || 当作短路表达式使用的 或
-> 当前面为 true 的时候, 那么就直接返回前面的值
-> 当前面为 false 的时候, 那么就返回后面的值, 不管后面是不是 false
window.onscroll = function () {
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
console.log(scrollLeft)
}
8. 短路表达式
8-1 或( || )
作用: 可以用 || 运算符分割两个表达式,如果前面的表达式的结果为 true ,那么后面的就不执行; 只有前面为 false 的时候,才会去执行后面的表达式。
当你使用 || 短路表达式赋值的时候:
前面表达式是 true 的时候,那么就得到前面表达式的结果;
前面表达式是 false 的时候,那么就得到后面表达式的结果(不管后面表达式的结果是 true ,还是 false)
8-2 且 ( && )
作用: 可以用 && 运算符分割两个表达式,如果前面的表达式的结果为 true ,那么后面的才会执行(如果前面表达式的结果为 false 的时候,后面的表达式就不执行了)。
当你使用 && 短路表达式赋值的时候:
前面表达式是 true 的时候,那么直接运算后面表达式的结果赋值;
前面表达式是 false 的时候,那么直接把前面的结果返回。
二、DOM文档对象模型
DOM —— Document Object Model 文档对象模型
DOM 是一个以树状结构存在的内容
DOM 的顶级是 document 表示当前文档
因为我们 PC 端的文档是插入到浏览器里面运行的,所以在 PC 端,document 上面还有一个window
注意: window 下面有一个 document
1.获取DOM元素
通过 JS 获取到页面中的元素
1-1 非常规标签
(1)html
语法: document.documentElement
var html = document.documentElement
console.log(html)
(2)head
语法: document.head
var head = document.head
console.log(head)
(3)body
语法: document.body
var body = document.body
console.log(body)
1-2 常规标签
下面例子 body 标签里面的代码
<body>
<li>1</li>
<li class="active">2</li>
<li class="active" id="abc">3</li>
<li class="active aaa">4</li>
<button id="btn">按钮</button>
<p id="a">外面</p>
<div id="box">
<p id="a">里面</p>
</div>
<ul>
<li class="box">1</li>
<li class="box">2</li>
<li class="box">3</li>
<li class="box">4</li>
<li class="box">5</li>
<li class="box">6</li>
<li class="box">7</li>
<li class="box">8</li>
<li class="box">9</li>
<li class="box">10</li>
</ul>
<input type="text" name="username">
<input type="text" name="username">
<div name="username">123</div>
</body>
(1)getElementById()
语法: 查找范围.getElementById(‘id名称’)
查找范围: document 或者一个 元素
返回值:
如果有这个 id 匹配的元素,就是这个元素
如果没有这个 id 匹配的元素,就是 null
var btn = document.getElementById('btn')
console.log(btn)
(2)getElementsByTagName()
语法: 查找范围.getElementsByTagName(‘标签名’)
返回值: 是一个 伪数组 (数组常用方法用不了)
如果有这个标签名匹配的元素,有多少获取多少
如果没有这个标签匹配的元素,返回一个空的伪数组
var box = document.getElementsByTagName('p')
console.log(box)
// 你想准确的拿到某一个元素, 要么遍历, 要么使用 [索引]
// var div = document.getElementsByTagName('div')[0]
//console.log(div)
// 在 div 范围下通过标签名查找多个叫做 p 的元素
// var p2 = div.getElementsByTagName('p')
//console.log(p2)
(3)getElementsByClassName()
语法: 查找范围.getElementsByClassName(‘类名’)
返回值: 是一个 伪数组
如果有这个类名匹配的元素,有多少获取多少
如果没有这个类名匹配的元素,返回一个空的伪数组
var box = document.getElementsByClassName('box')
console.log(box)
(4)getElementsByName()
语法: 查找范围.getElementsByName(‘元素name属性的值’)
返回值: 是一个 伪数组
如果有元素的 name 属性的值匹配,有多少获取多少
如果没有元素的 name 属性的值匹配,那么就是空的为数组
var inp = document.getElementsByName('username')
console.log(inp)
(5)querySelector()
语法: 查找范围.querySelector(‘选择器’)
选择器: 能在 CSS 里面写的选择器,这里都可以写
返回值:
如果找到选择器匹配的元素,返回第一个找到的内容
如果没有选择器匹配的元素,返回 null
特点: IE 低版本不支持
var box = document.querySelector('ul > li:nth-child(2)')
console.log(box)
(6)querySelectorAll()
语法: 查找范围.querySelectorAll(‘选择器’)
选择器: 能在 CSS 里面写的选择器,这里都可以写
返回值:
如果找到选择器匹配的元素,有多少获取多少
如果没有选择器匹配的元素,返回一个空的伪数组
特点: IE 低版本不支持
var box = document.querySelectorAll('ul > li:nth-child(odd)')
console.log(box)
2.操作元素属性
元素的属性
id / class / style / src / type / name / href / border / … ——叫做原生属性
style 是属性名, 这个属性的作用就是给元素设置内联样式
index / abc / aaa / … ——自定义属性
不是标签原生自带的属性, 是我们自己随便书写的一个属性
data-xxx 开头的属性——我们都叫做 H5 自定义属性
2-1 原生属性
原生属性 是一个 读写属性
语法: 元素.属性名
读: 元素.属性名——获取元素该属性的值
写: 元素.属性名 = ‘值’——设置该元素的该属性的值
注意: class 除外,操作 类名 使用 元素.className
<body>
<div data-a="100" abc="123"></div>
<input type="text">
<img src="" alt=""
</body>
var div = document.querySelector('div')
var inp = document.querySelector('input')
// 给 div 设置一个 id 属性
div.id = 'box'
// 读取 div 身上的 id 属性
console.log(div.id)
console.log(div)
// 给 input 设置一下 type 属性
inp.type = 'password'
给 div 设置一个 id 属性
读取 div 身上的 id 属性
给 input 设置一下 type 属性
2-2 自定义属性
不能直接点语法操作
(1)setAttribute(‘属性名’, ‘属性值’)
给元素标签上设置属性
var div = document.querySelector('div')
var inp = document.querySelector('input')
// 设置自定义属性
div.setAttribute('index', 100)
div.setAttribute('id', 'box')
设置自定义属性
(2)getAttribute(‘属性名’)
获取元素上的属性的值
// 获取自定义属性
var str = div.getAttribute('index')
console.log(str)
(3)removeAttribute(‘属性名’)
删除元素上的属性
// 删除自定义属性
div.removeAttribute('abc')
(4)三种方法的特点
可以操作自定义属性,也可以操作原生属性;
不管你设置什么数据类型,当你再次从标签上拿到的时候,都是字符串。
2-3 H5 自定义属性
每一个元素身上有一个属性叫做 dataset
里面包含了所有 H5 自定义属性
key 是除了 data- 以外的内容
value 就是这个属性的值
操作 H5 的自定义属性
直接在 dataset 里面进行操作就可以
获取: 元素.dataset.名字
名字: 标签上写 data-a, 使用 a
设置: 元素.dataset.名字 = ‘值’
名字: 如果你在这里写 a ,那么映射在标签上就是 data-a
// 获取元素标签上的 data-a 属性
var str = div.dataset.a
console.log(str)
// 设置元素标签上的 data-hello 属性, 设置值为 world
div.dataset.hello = 'world'
// 删除元素标签上的 data-hello 属性
// 直接删除 dataset 对象中的 hello 成员
delete div.dataset.hello
3.操作元素类名
3-1 按照原生属操作
设置类名: 元素.className = ‘你想设置的类名’
修改类名: 元素.className = ‘新值’
追加类名: 元素.className = 元素.className + ‘新类名’
注意: 新类名前面要有一个 空格
删除类名: 获取类名
- 截取字符串
- 按照空格切开,循环遍历,找到一个你想删除的删除掉
- 再写一遍
<style>
div {
width: 100%;
height: 50px;
/* background-color: skyblue; */
/* display: none; */
position: absolute;
top: -50px;
left: 0;
background-color: skyblue;
transition: top .5s linear;
}
div.box {
/* background-color: pink; */
/* display: block; */
top: 0;
}
button {
margin-top: 100px;
}
</style>
<body>
<button>按钮</button
<div class="a b c d e f g h i j">我是 div 标签</div>
</body>
// 0. 获取元素
var div = document.querySelector('div')
// 1. 原生属性方式操作类名
// 1-1. 设置类名
div.className = 'box'
// 1-2. 修改类名
div.className = 'box2'
// 1-3. 追加类名
div.className += ' abc'
3-2 H5 标准提供的 API
元素身上有一个叫做 classList 的属性,里面包含了所有元素身上设置的类名。这个 classList 提供了一系列方法来操作
(1) add()
语法: 元素.classList.add(‘你要添加的类名’)
(2) remove()
语法: 元素.classList.remove(‘你要移除的类名’)
(3) toggle()
语法: 元素.classList.toggle(‘你要切换的类名’)
当元素有这个类名的时候, 就是删除
当元素没有这个类名的时候, 就是添加
// 获取元素
var div = document.querySelector('div')
// 添加类名
div.classList.add('box')
//删除类名
div.classList.remove('h')
// 求换类名
var btn = document.querySelector('button')
btn.onclick = function () {
// 执行这句代码的时候, 如果 div 没有 box 类名, 就添加
// 执行这句代码的时候, 如果 div 有 box 类名, 就删除
div.classList.toggle('box')
}
4.操作元素文本内容
4-1 innerHTML
读写属性
读: 获取元素内部的所有内容
文本 + 标签 全部内容
语法: 元素.innerHTML
以字符串的形式返回
写: 设置元素内部的超文本内容
语法: 元素.innerHTML = ‘你要设置的内容’
当你的字符串里面出现 html 结构的时候,会自动解析
<body>
<div>
hello world
<p>你好 世界</p>
hello world
</div>
</body>
// 获取元素
var div = document.querySelector('div')
var inp = document.querySelector('input')
// 获取元素的超文本内容
var str = div.innerHTML
console.log(str)
console.log(typeof str)
// 设置元素的超文本内容
div.innerHTML = '<span>我是新来的内容</span>'
获取元素的超文本内容
设置元素的超文本内容( 覆盖式的写入 )
标签会自动解析
4-2 innerText
读写属性
操作元素的 文本内容
读: 获取元素内部的所有文本内容
包括子元素所有后代元素里面的文本内容
标签内容不获取(只获取文本内容)
语法: 元素.innerText
写: 设置元素内部的文本内容
完全覆盖式的写入
语法: 元素.innerText = ‘你要设置的内容’
当你的字符串里面出现 html 结构的时候,不会 自动解析
// 获取元素
var div = document.querySelector('div')
var inp = document.querySelector('input')
// 获取元素的文本内容
var str = div.innerText
console.log(str)
// 设置元素的文本内容
div.innerText = '<span>我是新来的内容</span>'
获取元素的文本内容
设置元素的文本内容 ( 覆盖式的写入 )
标签不会自动解析 ,会当作文本的一部分
4-3 value
读写属性
操作表单元素的 value 属性
读: 获取表单元素的 value 属性
语法: 元素.value
写: 设置表单元素的 value 属性
语法: 元素value = ‘你要设置的内容’
// 获取元素
var div = document.querySelector('div')
var inp = document.querySelector('input')
// 设置元素的 value 值
inp.value = '你好 世界'
// 获取元素的 value 值
var str = inp.value
console.log(str)
设置元素的 value 值
获取元素的 value 值