一.概述
1.浏览器对象模型(Browser Object Model),他提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window
2.BOM由一系列相关的对象构成,并且每个对象都提供了很多方法和属性,其中包括:
(1)Window:代表整个浏览器窗口,同时Window也是网页中的全局对象
(2)Navigator:代表的当前浏览器信息,通过该对象可以识别不同浏览器
(3)Location:代表当前浏览器的地址栏信息,通过它可以获取地址栏信息或操作浏览器跳转页面
(4)History:代表浏览器的历史记录,可以通过该对象操作浏览器的历史记录
- 由于隐私设置,该对象不能获取到具体的历史记录,只能操作浏览器前进或后退
(5)Screen:代表用户的屏幕信息,通过该对象可以获取到用户的显示器信息
3.BOM并没有ECMA,W3C这种标准,由浏览器厂商自己定义,所以兼容性不是很好
4.BOM比DOM大,它包含了DOM,BOM中最大的是window
5.window对象是浏览器的顶级对象
(1)他是JS访问浏览器窗口的一个接口
(2)他是一个全局对象。定义在全局作用域的变量和函数都会变成window的属性和方法
(3)window.name是window的一个特殊对象
二.window对象常见事件
1.窗口加载事件:
(1)语法:window.onload=function(){}或window.addEventListener(“load”,function(){})
(2)window.onload是窗口加载事件,当文档内容全部加载完成会触发该事件
(3)有了window.onload就可以把JS代码写道元素上,因为onload是等页面全部加载完毕再去执行处理函数
(4)window.onload传统注册事件方式只能写一次,如果有多次,会以最后一个为准
(5)window.addEventListener(“load”,function(){})该方法写多个就不会冲突
(6)若是页面图片非常多,建议使用document.addEventListener(‘DOMContentLoaded’,function(){})
- 该方法会将DOM加载完毕就显示,所以比load块
-
2.调整窗口大小事件:
(1)语法:window.onresize=function(){}或window.addEventListener(“resize”,function(){})
(2)只要窗口大小发生变化就会触发事件,调用其处理函数
(3)window.innerWidth表示当前屏幕的宽度 同理window.innerHeight表示当前屏幕高度三.定时器
1.setTimeout():用于设置一个延时器,该延时器在时间到期执行调用函数
(1)语法:window.setTimeout(调用函数,[延迟的毫秒数]); //window可以省略,时间的单位是毫秒
setTimeout(function(){},2000); //到了2秒就去调用函数,调用一次就结束
(2)一个页面可能有很多延时器,一般都给取名字,也就是赋值给变量
(3)此处的调用函数也称为回调函数(callback):需要等待,时间到了再回来调用
2.window.clearTimeout(timeout ID):停止setTimeout延时器
3.setInterval():定时器,用于重复调用,每个设定的时间,就调用一次函数
(1)语法:window.setInterval(调用函数,[延迟的毫秒数]); //window可以省略,时间的单位是毫秒
- setInterval(function(){},2000); //每经过2秒就去调用一次函数
(2)一个页面可能有很多定时器,一般都给取名字,也就是赋值给变量
4.window.clearInterval(interval ID/Name):清除先前通过调用Interval()建立的定时器
5.案例:京东秒杀倒计时
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="times_wrap" class="time_num">
距离结束时间:
<div class="time_w">
<b id="times_d" class="time"> </b>天
<b id="times_h" class="time"> </b>时
<b id="times_m" class="time"> </b>分
<b id="times_s" class="time"> </b>秒
</div>
</div>
<script>
var time_wrap = document.getElementById("times_wrap");
var time_d = document.getElementById("times_d");
var time_h = document.getElementById("times_h");
var time_m = document.getElementById("times_m");
var time_s = document.getElementById("times_s");
var time_end = new Date("2022/5/27 18:00:00"); // 设定结束时间
time_end = time_end.getTime();
function show_time(){
var time_now = new Date(); // 获取当前时间
time_now = time_now.getTime();
var time_distance = time_end - time_now; // 结束时间减去当前时间
var int_day, int_hour, int_minute, int_second;
if(time_distance >= 0){
// 天时分秒换算
int_day = Math.floor(time_distance/86400000)
time_distance -= int_day * 86400000;
int_hour = Math.floor(time_distance/3600000)
time_distance -= int_hour * 3600000;
int_minute = Math.floor(time_distance/60000)
time_distance -= int_minute * 60000;
int_second = Math.floor(time_distance/1000)
// 时分秒为单数时、前面加零站位
if(int_hour < 10)
int_hour = "0" + int_hour;
if(int_minute < 10)
int_minute = "0" + int_minute;
if(int_second < 10)
int_second = "0" + int_second;
// 显示时间
time_d.innerHTML = int_day;
time_h.innerHTML = int_hour;
time_m.innerHTML = int_minute;
time_s.innerHTML = int_second;
}else{
time_d.innerHTML = time_d.innerHTML;
time_h.innerHTML = time_h.innerHTML;
time_m.innerHTML = time_m.innerHTML;
time_s.innerHTML = time_s.innerHTML;
}
};
window.setInterval(function(){
show_time();
}, 1000);
</script>
</body>
</html>
案例:模拟获取验证码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="number">
<button>发送</button>
<script>
var btn = document.querySelector('button');
var time = 60;
var timer = btn.addEventListener('click',function(){
btn.disabled = true;
setInterval(function(){
if(time == 0){
//复原按钮并清除定时器
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = '发送';
time = 60;
}else{
btn.innerHTML = '还剩'+time+'秒可再次发送';
time--;
}
},1000)
})
</script>
</body>
</html>
四.this指向问题:
1.方法中一般是指向调用它的对象
2.全局作用域和普通函数中this指向全局对象window
3.构造函数中this指向构造函数的实例
五.JS执行队列:
1.JS最大的特点就是单线程,也就是说同一时间只能做一件事。例如添加和删除不能同时进行,后来HTML5提出Web Worker标准,允许JS创建多线程,因此出现了同步和异步
2.同步:一个任务完成再去执行另一个。例如烧水十分钟,烧开了再去切菜炒菜
3.异步:做一件事的同时可以做其他的事。例如烧水的过程中去切菜
4.JS执行机制:JS先执行执行栈的同步任务,异步任务放到任务队列,一旦执行栈的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行
(1)同步任务:都在主线程上执行,形成一个执行栈
(2)异步任务:通过回调函数实现的(异步任务放到任务队列)
六.location对象
1.window提供的属性,用于获取或设置窗体的url,并可用于解析url,该属性返回一个对象,所以将这个属性也成为location对象
2.url:统一资源定位符,是互联网上标准资源的地址,互联网的每个文件都有一个唯一的url,它包含的信息指出文件的位置以及浏览器该怎么处理它
(1)url的一般语法格式:protocol://host[:port]/path/[?query]#fragment
- 例如:http://www.itcast.cn/index.html?name=andy&age=18#link | 组成 | 说明 | | —- | —- | | protocol | 通信协议 常用的http,ftp,maito等 | | host | 主机(域名) | | port | 端口号 可选,省略时使用默认端口号,例如http的默认端口为80 | | path | 路径由零个或多个/间隔的字符串 | | query | 参数 以键值对的形式 通过&分隔 | | fragment | 片段 #后内容 常见于链接 锚点 |
3.location对象的属性:
location对象属性 | 返回值 |
---|---|
location.href | 获取或设置整个url |
location.host | 返回主机(域名) |
location.port | 返回端口号 未写端口号返回空字符串 |
location.pathname | 返回路径 |
location.search | 返回参数 |
location.hash | 返回片段 |
4.location的常用方法:
location对象方法 | 返回值 |
---|---|
location.assign() | 重定向页面,也就是跳转页面 |
location.replace() | 替换当前页面 |
location.reload() | 重回加载页面 |
(1)location.assign()会记录历史,所以可以回退
(2)location.replace():不记录历史,不能回退
七.navigator对象
1.包含有关浏览器的信息,常用的是userAgent,该属性返回由客户机发送服务器的请求头信息
八.history对象
1.与浏览器历史记录进行交互。该对象包含用户访问过的URL
2.history对象方法
history对象方法 | 作用 |
---|---|
back() | 可以后退功能 |
forward() | 前进功能 |
go(参数) | 前进后退功能 参数为1前进一个页面 如果是-1 后退一个页面 |
length | 获取当前访问的链接数量 |