innerHeight
和 innerWidth
这两个方法分别是用来获取浏览器窗口的宽度和高度(包含滚动条的)
var windowHeight = window.innerHeight
console.log(windowHeight)
var windowWidth = window.innerWidth
console.log(windowWidth)
alert
是在浏览器弹出一个提示框
window.alert('我是一个提示框')
confirm
是在浏览器弹出一个询问框
var boo = window.confirm('我是一个询问框')
console.log(boo)
prompt
是在浏览器弹出一个输入框
var str = window.prompt('请输入内容')
console.log(str)
location
location.href
这个属性存储的是浏览器地址栏内 url 地址的信息
console.log(window.location.href)
location.href
这个属性也可以给他赋值
window.location.href = './index.html'
// 这个就会跳转页面到后面你给的那个地址
location.reload()
这个方法会重新加载一遍页面,就相当于刷新是一个道理
window.location.reload()
// 跳转页面 能后退
// location.assign('http://www.baidu.com')
// location.href = 'http://www.baidu.com'
// 跳转页面 不能后退
// location.replace('http://www.baidu.com')
http://127.0.0.1:8848/zz2007/%E7%AC%AC%E4%BA%8C%E5%91%A8%E8%AF%BE%E4%BB%B6/day09/02-bom.html?id=1&aaa=22&bb=aasd#aaa
origin: "http://127.0.0.1:8848" 完整的 服务器地址
protocol: "http:" 协议
host: "127.0.0.1:8848" 主机
hostname: "127.0.0.1" 主机名
port: "8848" 端口号***********
path: 路径
pathname: 路径名
"/zz2007/%E7%AC%AC%E4%BA%8C%E5%91%A8%E8%AF%BE%E4%BB%B6/day09/02-bom.html"
搜索 搜索字段**************
search: "?id=1&aaa=22&bb=aasd"
哈希值
hash: "#aaa"
history
history.back
是用来会退历史记录的,就是回到前一个页面,就相当于浏览器上的 ?? 按钮
window.history.back()
history.go(-1)
- 前提是你要有上一条记录,不然就是一直在这个页面,也不会回退
#### history.forword
- `history.forword` 是去到下一个历史记录里面,也就是去到下一个页面,就相当于浏览器上的 ?? 按钮
```javascript
window.history.forward()
history.go(1)
刷新当前页面
history.go(0)
navigator
navigator.userAgent
是获取的浏览器的整体信息
console.log(window.navigator.userAgent)
// Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
console.log(navigator.userAgent)
if(navigator.userAgent.toLowerCase().indexOf('windows')!=-1){
console.log('window pc')
}else{
console.log('移动端')
if(navigator.userAgent.toLowerCase().indexOf('iphone')!=-1 || navigator.userAgent.toLowerCase().indexOf('ipad')!=-1){
console.log('ios')
}else{
console.log('安卓')
}
}
navigator.appName
获取的是浏览器的名称
console.log(window.navigator.appName)
navigator.appVersion
获取的是浏览器的版本号
console.log(window.navigator.appVersion)
navigator.platform
获取到的是当前计算机的操作系统
console.log(window.navigator.platform)
这个不在是对象了,而是一个事件
是在页面所有资源加载完毕后执行的
window.onload = function () {
console.log('页面已经加载完毕')
}
<html>
<head>
<meta charset="UTF-8" />
<script>
// 这个代码执行的时候,body 还没有加载
// 这个时候我们就获取不到 body 中的那个 div
// 就需要使用 window.onload 事件
window.onload = function () {
// 这个函数会在页面加载完毕以后在执行
// 那么这个时候页面的 DOM 元素都已经加载了,我们就可以获取 div 了
}
</script>
</head>
<body>
<div></div>
</body>
</html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<div></div>
<script>
// 这个代码执行的时候,body 已经加载完毕了
// 在这里就可以获取到 div,写不写 window.onload 就无所谓了
window.onload = function () {
// 这个函数会在页面加载完毕以后在执行
// 那么这个时候页面的 DOM 元素都已经加载了,我们就可以获取 div 了
}
</script>
</body>
</html>
这个 onscroll 事件是当浏览器的滚动条滚动的时候触发
或者鼠标滚轮滚动的时候出发
window.onscroll = function () {
console.log('浏览器滚动了')
}
获取的是页面向上滚动的距离
一共有两个获取方式
document.body.scrollTop
document.documentElement.scrollTop
window.onscroll = function () {
console.log(document.body.scrollTop)
console.log(document.documentElement.scrollTop)
scollTop = document.documentElement.scrollTop || document.body.scrollTop
}
- 两个都是获取页面向上滚动的距离
- 区别:
- IE 浏览器
- 没有 `DOCTYPE` 声明的时候,用这两个都行
- 有 `DOCTYPE` 声明的时候,只能用 `document.documentElement.scrollTop`
- Chrome 和 FireFox
- 没有 `DOCTYPE` 声明的时候,用 `document.body.scrollTop`
- 有 `DOCTYPE` 声明的时候,用 `document.documentElement.scrollTop`
- Safari
- 两个都不用,使用一个单独的方法 `window.pageYOffset `
#### scrollLeft
- 获取页面向左滚动的距离
- 也是两个方法
- `document.body.scrollLeft`
- `document.documentElementLeft`
```javascript
window.onscroll = function () {
console.log(document.body.scrollLeft)
console.log(document.documentElement.scrollLeft)
}
scrollTop
一样滚动条的距离 也可以进制设置
document.body.scrollTop= 0
document.documentElement.scrollTop = 0
倒计时多少时间以后执行函数
语法: setTimeout(要执行的函数,多长时间以后执行)
会在你设定的时间以后,执行函数
var timerId = setTimeout(function () {
console.log('我执行了')
}, 1000)
console.log(timerId) // 1
每间隔多少时间就执行一次函数
语法: setInterval(要执行的函数,间隔多少时间)
var timerId = setInterval(function () {
console.log('我执行了')
}, 1000)
设置定时器的时候,他的返回值是部分 setTimeout
和 setInterval
的
只要有一个定时器,那么就是一个数字
var timerId = setTimeout(function () {
console.log('倒计时定时器')
}, 1000)
var timerId2 = setInterval(function () {
console.log('间隔定时器')
}, 1000)
console.log(timerId) // 1
console.log(timerId2) // 2
我们刚才提到过一个 timerId,是表示这个定时器是页面上的第几个定时器
这个 timerId 就是用来关闭定时器的数字
我们有两个方法来关闭定时器 clearTimeout
和 clearInterval
var timerId = setTimeout(function () {
console.log('倒计时定时器')
}, 1000)
clearTimeout(timerId)
var timerId2 = setInterval(function () {
console.log('间隔定时器')
}, 1000)
coearInterval(timerId2)
原则上是
clearTimeout
关闭 setTimeout
clearInterval
关闭 setInterval
但是其实是可以通用的,他们可以混着使用
var timerId = setTimeout(function () {
console.log('倒计时定时器')
}, 1000)
// 关闭倒计时定时器
clearInterval(timerId)
var timerId2 = setInterval(function () {
console.log('间隔定时器')
}, 1000)
// 关闭间隔定时器
clearTimeout(timerId2)
getElementById
是通过标签的 id 名称来获取标签的
因为在一个页面中 id 是唯一的,所以获取到的就是一个元素
<body>
<div id="box"></div>
<script>
var box = document.getElementById('box')
console.log(box) // <div></div>
</script>
</body>
getElementsByClassName
是用过标签的 class 名称来获取标签的
因为页面中可能有多个元素的 class 名称一样,所以获取到的是一组元素
哪怕你获取的 class 只有一个,那也是获取一组元素,只不过这一组中只有一个 DOM 元素而已
<body>
<div calss="box"></div>
<script>
var box = document.getElementsByClassName('box')
console.log(box) // [<div></div>]
console.log(box[0]) // <div></div>
</script>
</body>
getElementsByTagName
是用过标签的 标签 名称来获取标签的
因为页面中可能有多个元素的 标签 名称一样,所以获取到的是一组元素
哪怕真的只有一个这个标签名,那么也是获取一组元素,只不过这一组中只有一个 DOM 元素而已
<body>
<div></div>
<script>
var box = document.getElementsByTagName('div')
console.log(box) // [<div></div>]
console.log(box[0]) // <div></div>
</script>
</body>
getElementsByClassName
一样,获取到的是一个长得很像数组的元素querySelector
是按照选择器的方式来获取元素
也就是说,按照我们写 css 的时候的选择器来获取
这个方法只能获取到一个元素,并且是页面中第一个满足条件的元素
console.log(document.querySelector('div')) // 获取页面中的第一个 div 元素
console.log(docuemnt.querySelector('.box')) // 获取页面中第一个有 box 类名的元素
console.log(document.querySelector('#box p')) // 获取页面中第一个 id 名为 box 的元素
querySelectorAll
是按照选择器的方式来获取元素
这个方法能获取到所有满足条件的元素,以一个伪数组的形式返回
console.log(document.querySelectorAll('div')) // 获取页面中的所有的 div 元素
console.log(docuemnt.querySelectorAll('.box')) // 获取页面中所有有 box 类名的元素
标准属性 ipt.value ipt.checked
获取元素内部的 HTML 结构
<body>
<div>
<p>
<span>hello</span>
</p>
</div>
<script>
var div = document.querySelector('div')
console.log(div.innerHTML)
/*
<p>
<span>hello</span>
</p>
*/
</script>
</body>
设置元素的内容
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.innerHTML = '<p>hello</p>'
</script>
</body>
获取元素内部的文本(只能获取到文本内容,获取不到 html 标签)
<body>
<div>
<p>
<span>hello</span>
</p>
</div>
<script>
var div = document.querySelector('div')
console.log(div.innerText) // hello
</script>
</body>
可以设置元素内部的文本
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.innerText = '<p>hello</p>'
</script>
</body>
<p>hello</p>
当作一个文本出现在 div 元素里面,而不会把 p 解析成标签获取元素的某个属性(包括自定义属性)
<body>
<div a="100" class="box"></div>
<script>
var div = document.querySelector('div')
console.log(div.getAttribute('a')) // 100
console.log(div.getAttribute('class')) // box
</script>
</body>
给元素设置一个属性(包括自定义属性)
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.setAttribute('a', 100)
div.setAttribute('class', 'box')
console.log(div) // <div a="100" class="box"></div>
</script>
</body>
直接移除元素的某个属性
<body>
<div a="100" class="box"></div>
<script>
var div = document.querySelector('div')
div.removeAttribute('class')
console.log(div) // <div a="100"></div>
</script>
</body>
专门用来给元素添加 css 样式的
添加的都是行内样式
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.style.width = "100px"
div.style.height = "100px"
div.style.backgroundColor = "pink"
console.log(div)
// <div style="width: 100px; height: 100px; background-color: pink;"></div>
</script>
</body>
专门用来操作元素的 类名的
<body>
<div class="box"></div>
<script>
var div = document.querySelector('div')
console.log(div.className) // box
</script>
</body>
也可以设置元素的类名,不过是全覆盖式的操作
<body>
<div class="box"></div>
<script>
var div = document.querySelector('div')
div.className = 'test'
console.log(div) // <div class="test"></div>
</script>
</body>
div.classList.add('box')//添加类名
div.classList.remove('box')//删除类名
div.classList.contains('box')//true 有类名 false 没有这个类,名
DOM
树就是我们 html
结构中一个一个的节点构成的
不光我们的标签是一个节点,我们写的文本内容也是一个节点,注释,包括空格都是节点
DOM
的节点我们一般分为常用的三大类 元素节点 / 文本节点 / 属性节点getElementBy...
获取到的都是元素节点getAttribute
获取的就是元素的属性节点innerText
获取到的就是元素的文本节点childNodes
:获取某一个节点下 所有的子一级节点
<body>
<div>
<p>hello</p>
</div>
<script>
// 这个 oDiv 获取的是页面中的 div 元素,就是一个元素节点
var oDiv = document.querySelector('div')
console.log(oDiv.childNodes)
/*
NodeList(3) [text, p, text]
0: text
1: p
2: text
length: 3
__proto__: NodeList
*/
</script>
</body>
text
:从 <div> 一直到 <p>
中间有一个换行和一堆空格,这个是第一个节点,是一个文本节点p
:这个 p
标签就是第二个节点,这个是一个元素节点text
:从 </p> 一直到 </div>
中间有一个换行和一堆空格,这个是第三个节点,是一个文本节点children
:获取某一节点下所有的子一级 元素节点
<body>
<div>
<p>hello</p>
</div>
<script>
// 这个 oDiv 获取的是页面中的 div 元素,就是一个元素节点
var oDiv = document.querySelector('div')
console.log(oDiv.children)
/*
HTMLCollection [p]
0: p
length: 1
__proto__: HTMLCollection
*/
</script>
</body>
children
只要元素节点p
firstChild
:获取某一节点下子一级的 第一个节点
<body>
<div>
<p>hello</p>
</div>
<script>
// 这个 oDiv 获取的是页面中的 div 元素,就是一个元素节点
var oDiv = document.querySelector('div')
console.log(oDiv.firstChild) // #text
</script>
</body>
<div> 一直到 <p>
的那个换行和空格,是个文本节点lastChild
:获取某一节点下子一级的 最后一个节点
<body>
<div>
<p>hello</p>
</div>
<script>
// 这个 oDiv 获取的是页面中的 div 元素,就是一个元素节点
var oDiv = document.querySelector('div')
console.log(oDiv.lastChild) // #text
</script>
</body>
</p> 一直到 </div>
之间的换行和空格,是个文本节点firstElementChild
:获取某一节点下子一级 第一个元素节点
<body>
<div>
<p>hello</p>
</div>
<script>
// 这个 oDiv 获取的是页面中的 div 元素,就是一个元素节点
var oDiv = document.querySelector('div')
console.log(oDiv.firstElementChild) // <p>hello</p>
</script>
</body>
p
标签,是一个元素节点lastElementChild
:获取某一节点下子一级 最后一个元素节点
<body>
<div>
<p>hello</p>
<p>world</p>
</div>
<script>
// 这个 oDiv 获取的是页面中的 div 元素,就是一个元素节点
var oDiv = document.querySelector('div')
console.log(oDiv.lastElementChild) // <p>world</p>
</script>
</body>
<p>world</p>
,是一个元素节点nextSibling
:获取某一个节点的 下一个兄弟节点
<body>
<ul>
<li id="a">hello</li>
<li id="b">world</li>
<li id="c">!!!</li>
</ul>
<script>
// 这个 oLi 获取的是页面中的 li 元素,就是一个元素节点
var oLi = document.querySelector('#b')
console.log(oLi.nextSibling) // #text
</script>
</body>
id="b"
这个 li
的下一个兄弟节点id="b"
的下一个节点,是两个 li
标签之间的换行和空格,所以是一个文本节点previousSibling
:获取某一个节点的 上一个兄弟节点
<body>
<ul>
<li id="a">hello</li>
<li id="b">world</li>
<li id="c">!!!</li>
</ul>
<script>
// 这个 oLi 获取的是页面中的 li 元素,就是一个元素节点
var oLi = document.querySelector('#b')
console.log(oLi.previousSibling) // #text
</script>
</body>
id="b"
这个 li
的上一个兄弟节点id="b"
的上一个节点,是两个 li
标签之间的换行和空格,所以是一个文本节点nextElementSibling
:获取某一个节点的 下一个元素节点
<body>
<ul>
<li id="a">hello</li>
<li id="b">world</li>
<li id="c">!!!</li>
</ul>
<script>
// 这个 oLi 获取的是页面中的 li 元素,就是一个元素节点
var oLi = document.querySelector('#b')
console.log(oLi.nextElementSibling) // <li id="c">!!!</li>
</script>
</body>
id="b"
这个 li
的下一个兄弟元素节点id="b"
的下一个兄弟元素节点就是 id="c"
的 li
,是一个元素节点previousElementSibling
:获取某一个节点的 上一个元素节点
<body>
<ul>
<li id="a">hello</li>
<li id="b">world</li>
<li id="c">!!!</li>
</ul>
<script>
// 这个 oLi 获取的是页面中的 li 元素,就是一个元素节点
var oLi = document.querySelector('#b')
console.log(oLi.previousElementSibling) // <li id="a">hello</li>
</script>
</body>
id="b"
这个 li
的上一个兄弟元素节点id="b"
的上一个兄弟元素节点就是 id="a"
的 li
,是一个元素节点parentNode
:获取某一个节点的 父节点
<body>
<ul>
<li id="a">hello</li>
<li id="b">world</li>
<li id="c">!!!</li>
</ul>
<script>
// 这个 oLi 获取的是页面中的 li 元素,就是一个元素节点
var oLi = document.querySelector('#b')
console.log(oLi.parentNode) // <ul>...</ul>
</script>
</body>
li
的父元素节点li
的父亲就是 ul
,所以获取到的就是 ul
,是一个元素节点attributes
:获取某一个 元素节点 的所有 属性节点 (了解)
<body>
<ul>
<li id="a" a="100" test="test">hello</li>
</ul>
<script>
// 这个 oLi 获取的是页面中的 li 元素,就是一个元素节点
var oLi = document.querySelector('#a')
console.log(oLi.attributes)
/*
NamedNodeMap {0: id, 1: a, 2: test, id: id, a: a, test: test, length: 3}
0: id
1: a
2: test
length: 3
a: a
id: id
test: test
__proto__: NamedNodeMap
*/
</script>
</body>
li
有三个属性,id
/ a
/ test
三个,所以就获取到了这三个我们已经知道节点会分成很多种,而且我们也能获取到各种不同的节点
接下来我们就来聊一些各种节点之间属性的区别
我们先准备一段代码
<body>
<ul test="我是 ul 的一个属性">
<li>hello</li>
</ul>
<script>
// 先获取 ul
var oUl = document.querySelector('ul')
// 获取到 ul 下的第一个子元素节点,是一个元素节点
var eleNode = oUl.firstElementChild
// 获取到 ul 的属性节点组合,因为是个组合,我们要拿到节点的话要用索引
var attrNode = oUl.attributes[0]
// 获取到 ul 下的第一个子节点,是一个文本节点
var textNode = oUl.firstChild
</script>
</body>
nodeType
:获取节点的节点类型,用数字表示
console.log(eleNode.nodeType) // 1
console.log(attrNode.nodeType) // 2
console.log(textNode.nodeType) // 3
nodeType === 1
就表示该节点是一个 元素节点nodeType === 2
就表示该节点是一个 属性节点nodeType === 3
就表示该节点是一个 注释节点nodeName
:获取节点的节点名称
console.log(eleNode.nodeName) // LI
console.log(attrNode.nodeName) // test
console.log(textNode.nodeName) // #text
nodeName
就是 大写标签名nodeName
就是 属性名nodeName
都是 #textnodeValue
: 获取节点的值
console.log(eleNode.nodeValue) // null
console.log(attrNode.nodeValue) // 我是 ul 的一个属性
console.log(textNode.nodeValue) // 换行 + 空格
nodeValue
nodeValue
就是 属性值nodeValue
就是 文本内容- | nodeType | nodeName | nodeValue |
---|---|---|---|
元素节点 | 1 | 大写标签名 | null |
属性节点 | 2 | 属性名 | 属性值 |
文本节点 | 3 | #text | 文本内容 |
createElement
:用于创建一个元素节点
// 创建一个 div 元素节点
var oDiv = document.createElement('div')
console.log(oDiv) // <div></div>
createTextNode
:用于创建一个文本节点
// 创建一个文本节点
var oText = document.createTextNode('我是一个文本')
console.log(oText) // "我是一个文本"
appendChild
:是向一个元素节点的末尾追加一个节点
语法: 父节点.appendChild(要插入的子节点)
// 创建一个 div 元素节点
var oDiv = document.createElement('div')
var oText = document.createTextNode('我是一个文本')
// 向 div 中追加一个文本节点
oDiv.appendChild(oText)
console.log(oDiv) // <div>我是一个文本</div>
insertBefore
:向某一个节点前插入一个节点
语法: 父节点.insertBefore(要插入的节点,插入在哪一个节点的前面)
<body>
<div>
<p>我是一个 p 标签</p>
</div>
<script>
var oDiv = document.querySelector('div')
var oP = oDiv.querySelector('p')
// 创建一个元素节点
var oSpan = document.createElement('span')
// 将这个元素节点添加到 div 下的 p 的前面
oDiv.insertBefore(oSpan, oP)
console.log(oDiv)
/*
<div>
<span></span>
<p>我是一个 p 标签</p>
</div>
*/
</script>
</body>
removeChild
:移除某一节点下的某一个节点
dom.remove()
语法:父节点.removeChild(要移除的节点)
<body>
<div>
<p>我是一个 p 标签</p>
</div>
<script>
var oDiv = document.querySelector('div')
var oP = oDiv.querySelector('p')
// 移除 div 下面的 p 标签
oDiv.removeChild(oP)
console.log(oDiv) // <div></div>
</script>
</body>
replaceChild
:将页面中的某一个节点替换掉
语法: 父节点.replaceChild(新节点,旧节点)
<body>
<div>
<p>我是一个 p 标签</p>
</div>
<script>
var oDiv = document.querySelector('div')
var oP = oDiv.querySelector('p')
// 创建一个 span 节点
var oSpan = document.createElement('span')
// 向 span 元素中加点文字
oSpan.innerHTML = '我是新创建的 span 标签'
// 用创建的 span 标签替换原先 div 下的 p 标签
oDiv.replaceChild(oSpan, oP)
console.log(oDiv)
/*
<div>
<span>我是新创建的 span 标签</span>
</div>
*/
</script>
</body>
我们在操作 DOM
的时候,很重要的一点就是要操作元素的 css
样式
那么在操作 css
样式的时候,我们避免不了就要获取元素的样式
之前我们说过可以用 元素.style.xxx
来获取
但是这个方法只能获取到元素 行间样式,也就是写在行内的样式
<style>
div {
width: 100px;
}
</style>
<body>
<div style="height: 100px;">
<p>我是一个 p 标签</p>
</div>
<script>
var oDiv = document.querySelector('div')
console.log(oDiv.style.height) // 100px
console.log(oDiv.style.width) // ''
</script>
</body>
不管是外链式还是内嵌式,我们都获取不到该元素的样式
这里我们就要使用方法来获取了 getComputedStyle
和 currentStyle
这两个方法的作用是一样的,只不过一个在 非 IE 浏览器,一个在 IE 浏览器
语法:window.getComputedStyle(元素, null).要获取的属性
<style>
div {
width: 100px;
}
</style>
<body>
<div style="height: 100px;">
<p>我是一个 p 标签</p>
</div>
<script>
var oDiv = document.querySelector('div')
console.log(window.getComputedStyle(oDiv).width) // 100px
console.log(window.getComputedStyle(oDiv).height) // 100px
</script>
</body>
语法: 元素.currentStyle.要获取的属性
<style>
div {
width: 100px;
}
</style>
<body>
<div style="height: 100px;">
<p>我是一个 p 标签</p>
</div>
<script>
var oDiv = document.querySelector('div')
console.log(oDiv.currentStyle.width) // 100px
console.log(oDiv.currentStyle.height) // 100px
</script>
</body>
offsetLeft
和 offsetTop
和 offsetWidth
和 offsetHeight
left
和 top
值)内容宽高 + padding宽高 + border宽高
的和