Bom是浏览器对象模型,我们前面接触到的Dom文档对象模型,是操作页面元素的,这里的Bom是和浏览器交互的.
1.window
dom中的顶级对象是document,bom中的顶级对象是window,window中是包括document的.
2.load事件
开发中,我们通常需要在文档元素加载完毕后才开始写js代码,以避免在js中获取不到dom元素的问题,这时我们可以在window.onload回调中编写我们的js代码,它会在页面元素加载完毕后调用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>bom</title>
<style>
.content-box {
width: 450px;
height: 700px;
background-color: pink;
margin: 0 auto;
text-align: center;
overflow: hidden;
}
</style>
<script>
//获取button
let button = document.querySelector('button');
//获取num盒子
let numDiv = document.querySelector('.num');
//声明点击时要执行的函数
let onClickBtn = function() {
console.log(window);
}
//绑定点击事件
button.addEventListener('click', onClickBtn);
</script>
</head>
<body>
<div class="content-box">
<button>button</button>
<div class="num">
0
</div>
</div>
</body>
</html>
当我们在head中编写js代码获取dom标签时,由于页面从上往下的执行顺序,这时获取到的dom标签为null:
我们需要在onload中编写逻辑:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>bom</title>
<style>
.content-box {
width: 450px;
height: 700px;
background-color: pink;
margin: 0 auto;
text-align: center;
overflow: hidden;
}
</style>
<script>
window.addEventListener('load', function() {
//获取button
let button = document.querySelector('button');
//获取num盒子
let numDiv = document.querySelector('.num');
//声明点击时要执行的函数
let onClickBtn = function() {
console.log(window);
}
//绑定点击事件
button.addEventListener('click', onClickBtn);
});
</script>
</head>
<body>
<div class="content-box">
<button>button</button>
<div class="num">
0
</div>
</div>
</body>
</html>
3.resize事件
当浏览器窗口大小变化时会触发resize事件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>bom</title>
<style>
.content-box {
width: 450px;
height: 700px;
background-color: pink;
margin: 0 auto;
text-align: center;
overflow: hidden;
}
</style>
<script>
window.addEventListener('load', function() {
//获取button
let button = document.querySelector('button');
//获取num盒子
let numDiv = document.querySelector('.num');
let onResize = function() {
numDiv.innerText = window.innerHeight + ':' + window.innerWidth;
}
//绑定resize事件
window.addEventListener('resize', onResize);
});
</script>
</head>
<body>
<div class="content-box">
<button>button</button>
<div class="num">
0
</div>
</div>
</body>
</html>
当浏览器窗口发生变化时,我们可以在resize事件中做相应的事情.
4.定时器
(1)setTimeout/clearTimeout
setTimeout接收两个参数,第一个是回调函数,第二个是延迟毫秒数,会返回当前定时器的id,以供取消定时器使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>bom</title>
<style>
.content-box {
width: 450px;
height: 700px;
background-color: pink;
margin: 0 auto;
text-align: center;
overflow: hidden;
}
</style>
<script>
window.addEventListener('load', function() {
//获取button
let button = document.querySelector('button');
//获取num盒子
let numDiv = document.querySelector('.num');
//声明点击时要执行的函数
let onClick = function() {
let id = window.setTimeout(timeout, 3000);
console.log(id);
}
let timeout = function() {
console.log('setTimeout callback');
}
//绑定点击事件
button.addEventListener('click', onClick);
});
</script>
</head>
<body>
<div class="content-box">
<button>button</button>
<div class="num">
0
</div>
</div>
</body>
</html>
对应的取消定时器的方法为clearTimeout,只需要把定时器id传递过去即可:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>bom</title>
<style>
.content-box {
width: 450px;
height: 700px;
background-color: pink;
margin: 0 auto;
text-align: center;
overflow: hidden;
}
</style>
<script>
window.addEventListener('load', function() {
//获取添加计时器button
let buttonAdd = document.querySelector('.add-btn');
//获取删除计时器button
let buttonRemove = document.querySelector('.remove-btn');
let currentId;
//声明添加时要执行的函数
let onClickAdd = function() {
currentId = window.setTimeout(timeout, 3000);
}
//声明删除时要执行的函数
let onClickRemove = function() {
window.clearTimeout(currentId);
}
let timeout = function() {
console.log('setTimeout callback');
}
//绑定点击事件
buttonAdd.addEventListener('click', onClickAdd);
buttonRemove.addEventListener('click', onClickRemove);
});
</script>
</head>
<body>
<div class="content-box">
<button class="add-btn">添加计时器</button>
<button class="remove-btn">删除计时器</button>
</div>
</body>
</html>
这样,未执行的定时器就会被清除掉.
(2)setInterval/clearInterval
setInterval和clearInterval用法同timeout相似,功能上有所不同,interval每隔相应的时间都会调用一次回调函数,直至此定时器被移除:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>bom</title>
<style>
.content-box {
width: 450px;
height: 700px;
background-color: pink;
margin: 0 auto;
text-align: center;
overflow: hidden;
}
</style>
<script>
window.addEventListener('load', function() {
//获取添加计时器button
let buttonAdd = document.querySelector('.add-btn');
//获取删除计时器button
let buttonRemove = document.querySelector('.remove-btn');
let currentId;
//声明添加时要执行的函数
let onClickAdd = function() {
currentId = window.setInterval(interval, 1000);
}
//声明删除时要执行的函数
let onClickRemove = function() {
window.clearInterval(currentId);
}
let interval = function() {
console.log('setInterval callback');
}
//绑定点击事件
buttonAdd.addEventListener('click', onClickAdd);
buttonRemove.addEventListener('click', onClickRemove);
});
</script>
</head>
<body>
<div class="content-box">
<button class="add-btn">添加计时器</button>
<button class="remove-btn">删除计时器</button>
</div>
</body>
</html>