1. BOM概述
1.1 什么是BOM?
Browser Object Model浏览器对象模型,提供可独立于内容而与浏览器窗口进行交互的对象,其核心对象是windows。BOM由一系列相关的对象构成并且每个对象提供了很多方法和属性。BOM缺乏标准,JS语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分。
DOM V.S BOM
DOM: 文档对象模型
DOM就是把文档当作一个对象来看待
DOM的顶级对象是document
DOM主要学习的是操作页面元素
DOM是W3C的标准规范
BOM:浏览器对象模型
把浏览器当作对象看待
BOM的顶级对象是window
BOM的学习是浏览器窗口交互的一些对象,
BOM是浏览器厂商在各自浏览器上定义的,兼容性较差。
1.2 BOM的构成
1. BOM比DOM更大,包含BOM
2. window包含document, location, navigation, screen, history。
3. window是浏览器的顶级对象,具有双重角色,是JS访问浏览器的一个接口。是一个全局对象,定义在全局作用域的变量、函数都会变成window对象的属性和方法。在调用的时候可以省略window,前面学习的对话框都属于window对象方
法,如alert(), prompt()。window下的一个特殊属性window.name。
2 Window常见事件
2.1窗口加载事件
window.onload = function(){} //文档内容完全加载完成会触发该事件,调用处理函数,而不是立马执行。
//或者
window.addEventListener("load",function(){});
document.addEventListenner('DOMContentLoaded, function(){})DOMContentLoaded
//事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等。
//如果页面图片很多,则用onload加载时间长,用户体验差。
应用onload则JS代码可以放置于文件中任何位置,所以:
但是window.onload传统注册方式只能写一次,如果有多个,会以最后一个window.onload为准。
<!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>
<script>
//window.onload = function(){
// var btn = document.querySelector('button');
// btn.addEventListener('click', function(){
// alert('点击我');
// })
//}
//或者
window.addEventListener('load',function(){
var btn = document.querySelector('button');
btn.addEventListener('click', function(){
alert('11');
})
})
</script>
<button>点击</button>
</body>
</html>
2.2 调整页面窗口
1. window.onresize
window.onresize = function(){}
<body>
<script>
window.addEventListener('resize',function(){
console.log('变化了');
})
</script>
</body>
注意:只要窗口大小发生像素改变,就会触发这个事件,只要我们经常利用这个事件完成响应式布局,window,innerWidth当前屏幕宽度。
3 定时器
3.1 两种定时器
setTimeout()
setInterval()
3.2 setTimeout()
window.setTimeout(调用函数,[延迟的毫秒数]);
//1. 延迟时间单位为毫秒,省略则默认为0,立刻执行。
//2. 可以在外面定义一个函数,然后再setTimeout中写函数名就可以了。
//3. 页面中可能有很多定时器,我们会给定时器加标识符
var timer1 = setTimeout(callback, 3000);
var timer2 = setTimeout(callback, 5000);
//4. 两种写法:
setTimeout(callback, 3000);
setTimeout('callback()', 3000); //不提倡
1. setTimeout()方法用于设置一个定时器,该定时器在定时器到期后执行调用函数。window可以省略。
2. setTimeout()也称为回调函数。以前的element.onclick = function(){}也是回调函数。
案例:5秒自动关闭的广告
<body>
<img src="images/淘宝二维码.png" alt="" class="ad">;
<script>
var img = document.querySelector('img');
function close(){
img.style.display = 'none';
}
setTimeout(close, 5000);
</script>
</body>
3.3 清除定时器clearTimeout()
window.clearTimeout(timeoutID);
widow可省略
e.g:
<body>
<button>点击停止爆炸</button>
<script>
var btn = document.querySelector('button');
var timer = setTimeout(function(){
console.log('boom!');
})
btn.addEventListener('click', function(){
clearTimeout(timer);
})
</script>
</body>
3.4 setInterval()定时器
window.setInterval(回调函数, [间隔的毫秒数]);
1.重复调用一个函数,每隔这个时间,就回调一次函数
2. 调用函数可以直接写函数,函数名,’函数名()‘;三种方式
3. 毫秒默认,0执行
4. 定时器命名
<body>
<script>
setInterval(function(){
console.log('1');
}, 2000);
//setInterval() 每隔两秒反复回调
//setTimeout() 到时执行一次
</script>
</body>
案例:利用setInterval() 实现倒计时的效果
<body>
<button class="begin">开启定时器</button>
<button class="stop">停止定时器</button>
<script>
var begin = document.querySelector('.begin');
var stop = document.querySelector('.stop');
var timer = null; //写在外面才是全局变量!!
begin.addEventListener('click',function(){
timer = setInterval(function(){
console.log('hello');
}, 1000)
})
stop.addEventListener('click',function(){
clearInterval(timer);
})
</script>
</body>
3.5 停止setInterval()定时器
window.clearInterval(intervalID);
取消之前通过setInterval()建立的定时器
window可以省略,里面的参数是定时器的标识符。
案例:发送短信
算法:
1. 按钮点击后禁用
2.按钮时间倒计时,通过innerHTML修改
3. 时间到了0则返回原始状态
<body>
手机号码:<input type="number"> <button>发送</button>
<script>
var btn = document.querySelector('button');
var time = 3;//定义剩下的秒数
btn.addEventListener('click', function(){
btn.disabled = true;
var timer = setInterval(function(){
if(time == 0){
//清除定时器,复原按钮
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = '发送'
time = 10;
}else{
btn.innerHTML = '还剩' + time + '秒';
time--;
}
}, 1000);
})
</script>
</body>
3.6 this指向
1. 全局作用域或普通函数中的this指向window
2. 方法调用中,谁调用,this就指向谁
3. 构造函数中this指向构造函数的实例。
4 执行机制
4.1 JS是单线程
同一个时间,只能做一件事,因为JS就是为了处理页面中用户的交互,以及操作DOM而诞生的,比如我们对某个DOM元素进行添加和删除,不能同时进行,而是应该先添加,之后再删除。
4.3 同步和异步
1. 为了解决这个问题,利用多核CPU的计算能力,H5提出Web Worker标准,允许JS脚本创建多个现成,于是JS中出现了同步和异步。
2. 同步:上一个任务结束之后再去执行下一个任务,程序的执行顺序和人物的排列顺序是一致的,同步的,
3. 异步:在做一件事的同时还可以做其他事。
本质区别:执行顺序不同
4. 同步任务: 再主线程上进行,形成一个执行栈
5. 异步任务:JS的异步是通过回调函数实现的:普通事件click, resize;资源加载load,error;定时器:serInterval. setTimeout等。异步任务添加到回调队列(消息队列)中。
4.4 JS的执行机制
1.先执行执行栈的同步任务
2.遇到异步任务,则放入任务队列中
3.执行栈中的同步任务执行完毕后,系统会按次序读取执行任务队列中的异步任务。
5 location对象
5.1 什么是location对象
用于获取或设置窗体的url,并且可以用于解析url。因为这个属性返回的是一个对象,所以我们将这个属性也称为location对象。
5.2 URL
1. 同一资源定位符(Uniform Resource Locator, URL)是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
2. 语法格式:
protocal://host[:port]/path/[?query] # fragment
https://www.itcast.cn/index.html?name=andy&age=18#link
a.protocol 通信协议:http, ftp, maito等
b.host主机(域名): ww.itheima.com
c.port端口号:可选,省略默认为80
d.path路径
e. query: 参数
f.fragment:片段:链接,锚点
5.3 location属性
location.href:获取或设置整个URL
location.search: 返回参数
案例:5秒钟后自动跳转页面
案例:获取URL数据,数据在不同页面中的相互传递
5.4 location对象
location.assign() 和href一样,可以跳转页面
location,replace() 替换当前页面,不记录历史,不可后退
location.reload() 重新加载页面,相当于刷新按钮或f5
5.5 navigator对象
5.6 history对象
back()
forward()
go(参数)