BOM(Browser Object Model):浏览器对象模型,提供了与浏览器窗口进行交互的对象,其核心对象是window。
BOM的构成如下:
一、window对象
window对象是浏览器的顶级对象,它具有双重身份:
- 是JS访问浏览器窗口的一个接口
- 是一个全局对象(Global对象),定义在全局作用域中的变量、函数都会变成window对象的属性和方法
在调用全局方法的时候可以省略window,如: alert()、prompt()
window下有一个特殊的属性window.name(所以不要使用var定义name)
1-1、window对象常见属性
- window.innerWidth:可视区宽度
- window.innerHeight: 可视区高度
1-2、window对象常见事件
1-2-1、窗口加载事件
window.onload = function () {}
// 或者
window.addEventListener("load", function() {})
window.onload是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS文件等)
- 有了window.onload就可以把JS代码写到页面元素的上方,因为onload是等页面内容全部加载完毕,再去执行处理函数
- window.onload是传统注册事件方式,只能写一次,如果有多个,会以最后一个window.onload为准
- 如果使用addEventListener则没有限制
onload & DOMContentLoaded对比:
document.addEventListener('DOMContentLoaded',function(){})
- DOMContentLoaded事件触发时,仅当DOM加载完成,不包括样式表、图片、文件等
- ie9以上才支持
- 如果页面的图片很多,从用户访问到onload触发可能需要较长的事件,交互效果就不能实现,会影响用户的体验,此时用DOMContentLoaded事件比较合适
1-2-2、调整窗口大小事件
window.onresize = function(){}
// 或者
window.addEventListener("resize",function(){});
- 只要窗口大小发生像素变化,就会触发该事件
- 经常利用该事件完成响应式布局。(window.innerWidth为当前屏幕的宽度)
1-2-3、打开&关闭窗口事件
- 打开窗口:
语法:window.open(URL, target)
- URL为新窗口地址
- target为新窗口打开方式。包括:
- _blank:新窗口打开
- _self:当前窗口打开
- 关闭窗口:
语法:window.close()
1-3、window下的各类弹窗
1-3-1、alert()
语法:alert('提示内容')
1-3-2、confirm()
语法:confirm('提示内容')
- 点击确定,返回true
- 点击取消,返回false
1-3-3、prompt()
语法:prompt('提示内容', '文本框默认值')
- 点击确定,返回输入框的内容
- 点击取消,返回null
1-4、window对象提供的定时器
window对象提供了的定时器包括:
- setTimeout()
- setInterval()
以及清除定时器方法:
- clearTimeout()
1-4-1、setTimeout()
语法: window.setTimeout(调用函数, [延迟的毫秒数]);
- window可以省略
- 调用函数可以直接写函数,也可以写函数名
- 延迟的毫秒数默认是0
1-4-2、setInterval()
语法: window.setInterval(调用函数, [延迟的毫秒数]);
- window可以省略
- 调用函数可以直接写函数,也可以写函数名
- 延迟的毫秒数默认是0
- 第一次执行是间隔毫秒数之后执行,之后每个这个毫秒数便执行一次
1-4-3、clearTimeout()
语法: window.clearTimeout(timeoutID);
- window可以省略
- timeoutID为定时器的标识符
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<button>点击停止定时器</button>
<script>
const btn = document.querySelector('button');
const timer = setTimeout(function() {
console.log('爆炸了');
}, 5000);
btn.addEventListener('click', function() {
clearTimeout(timer);
})
</script>
</body>
</html>
1-4-4、倒计时案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
margin: 200px;
}
span {
display: inline-block;
width: 40px;
height: 40px;
background-color: #333;
font-size: 20px;
color: #fff;
text-align: center;
line-height: 40px;
}
</style>
</head>
<body>
<div>
<span class="hour">1</span>
<span class="minute">2</span>
<span class="second">3</span>
</div>
<script>
// 1. 获取元素
const hour = document.querySelector('.hour'); // 小时的黑色盒子
const minute = document.querySelector('.minute'); // 分钟的黑色盒子
const second = document.querySelector('.second'); // 秒数的黑色盒子
const inputTime = Date.now() + 24 * 3600 * 1000; // 制造24小时倒计时效果
countDown(); // 我们先调用一次这个函数,防止第一次刷新页面有空白
// 2. 开启定时器
setInterval(countDown, 1000);
function countDown() {
const nowTime = Date.now(); // 返回的是当前时间总的毫秒数
const times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数
// 获取小时
let h = Math.floor(times / 3600) + ''; // 转成字符串,方便后续补0
h = ('00' + h).slice(h.length);
hour.innerHTML = h;
// 获取分钟
let m = Math.floor(times % 3600 / 60) + '';
m = ('00' + m).slice(m.length);
minute.innerHTML = m;
// 获取秒数
let s = Math.floor(times % 3600 % 60) + '';
s = ('00' + s).slice(s.length);
second.innerHTML = s;
}
</script>
</body>
</html
!!一个补0小技巧:
在时分秒前先补上'00'两个0,再通过字符串的slice方法从原时间长度位置开始截取:
比如,剩余7分钟,倒计时上要显示成07,则:
- 先把7加上'00'变成'007'
- 截取007,从1的位置开始截取(因为原来7的长度为1),所以就变成了07
再比如,剩余20分钟,倒计时上显示成20,则:
- 先把20加上'00'变成'0020'
- 截取0020,从2的位置开始截取(因为原来20的长度为2),所以就还是20
二、location对象
window对象提供了一个location属性,用户获取设置窗口的URL并且可以用于解析URL。因为这个属性的返回值是一个对象,所以这个属性也称为location对象。
2-1、URL
统一资源定位符(Uniform Resource Locator)是互联网上标准资源的地址。互联网上每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL的一般语法格式为:
protocol://host[:port]/path/[?query]#fragment
组成 | 说明 |
---|---|
protocal | 通信协议 ,如:常用的http, ftp等 |
host | 主机(域名)www.hhxx.cn |
port | 端口号,可选,省略时使用默认端口(http默认端口80) |
path | 路径,一般来表示主机上的一个目录或文件地址 |
query | 参数,以键值对的形式,通过&分隔 |
fragment | 片段,#后面内容常见于链接锚点 |
2-2、location对象的属性
常见的location对象的属性包括:
location对象属性 | 返回值 |
---|---|
location.href | 获取或设置整个URL,获取:location.href,设置:location.href="新地址" |
location.host | 返回主机(域名) |
location.port | 返回端口号 |
location.pathname | 返回路径 |
location.search | 返回参数,拿到的是路径中问号后面的内容,如:?name=qll&age=18 |
location.hash | 返回片段 #后面内容,如:#view1 |
- 可使用onhashchange来监听hash的变化:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
</style>
</head>
<body>
<nav>
<a href="#view1">视图1</a>
<a href="#view2">视图2</a>
<a href="#view3">视图3</a>
</nav>
<div id="view">
这是第一个视图
</div>
<script>
{
let view = document.querySelector('#view');
setView();
// 路由发生变化时。调取一下
window.onhashchange = setView;
function setView() {
let hash = location.hash;
switch(hash) {
case "":
case "#view1":
view.innerHTML = '这是第一个视图';
break;
case '#view2':
view.innerHTML = '这是第二个视图';
break;
case '#view3':
view.innerHTML = '这是第三个视图';
break;
}
}
}
</script>
</body>
</html>
2-2、location对象的方法
常见的location对象的方法如下:
location对象的方法 | 返回值 |
---|---|
location.assign() | 跟href一样,可以跳转页面(也称为重定向页面) |
location.replace() | 替换当前页面,因为不记录历史,所以不能后退页面 |
location.reload() | 重新加载页面,相当于刷新按钮或者f5 |
总结:
跳转页面可通过三种方式:location.href = '新地址'、location.assign('新地址')、location.replace('新地址')
- location.href = 'xxx'与location.assign('xxx')效果相同,可返回上一个地址
- location.replace('xxx')后不能返回上一个地址
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
</style>
</head>
<body>
<button>跳转</button>
<script>
{
let btn = document.querySelector('button');
btn.onclick = function() {
console.log(location.href); // window可以省略
location.assign("https://www.baidu.com/s?wd='qll'");
// location.href = "https://www.baidu.com/s?wd='qll'";
// location.replace("https://www.baidu.com/s?wd='qll'");
}
}
</script>
</body>
</html>
三、navigator对象
navigator对象包含有关浏览器和设备的信息
其中常用属性包括:
- userAgent,该属性返回由客户机发送服务器的user-agent头部的值
- onLine,网络信息:true代表有网,false代表无网
四、history对象
history对象与浏览器历史记录进行交互,常用方法如下:
history对象方法 | 作用 |
---|---|
back() | 后退功能 |
forward() | 前进功能 |
go(参数) | 前进后退功能:1表示前进一个页面,-1表示后退一个页面 |