关于BOM

■ 关于BOM

BOM(browser object model),即浏览器对象模型
提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是windows
BOM由一系列相关对象构成,并且每个对象都提供了很多方法和属性
BOM缺乏标准,JS的标准化组织是ECMA,DOM是W3C,BOM最初是netscape的一部分

□ BOM的构成

BOM包含了DOM,比DOM更大
BOM的核心对象windows包含以下对象
 ▶ document
 ▶ location
 ▶ navigation
 ▶ screen
 ▶ history

■ 关于windows对象

windows对象是浏览器的顶级对象,它具有双重角色
 ▶ 它是JS访问浏览器窗口的一个接口
 ▶ 它是一个全局对象,定义在全局作用域中的变量,函数都会变成windows对象的属性和方法

注:
在调用的时候,可以省略window,alert(),prompt()都是windows对象
window对象有一个特殊的属性为name,window.name, 因此变量的命名最好不要用name

□ windows对象的常见事件

◆ 窗口加载事件

window.onload是窗口(页面)加载事件
当文档内容完全加载完成会触发该事件(包括图像,脚本文本,CSS文件等),就调用的处理函数
语法:

window.onload = function(){}

或者

window.addEventListener('load',function(){});

例1:
点击按钮后,不会触发监听器,因为代码都是从上到下执行的,button标签在JS方法下面,因此不会找到button

<html>
	<body>
		<script>
			var btn = document.querySelector('button');  
			btn.addEventListener('click',function(){
				alert('点击了我');  
			})
		</script>
		<button>点击</button>
	</body>
</html>

例2:
当点击按钮后,会触发监听器,当整个页面加载完事之后,再执行{}内部的方法,因此该部分代码放在页面的任何地方都会找到button
第二个监听方法会覆盖第一个监听方法,点击按钮会弹出"点击我2"

<html>
	<body>
		<script>
			window.onload = function(){ 
				var btn = document.querySelector('button');
				btn.addEventListener('click',function(){
					alert('点击我1');
				})
			}

			window.onload = function(){ //以该onload为准
				var btn = document.querySelector('button');
				btn.addEventListener('click',function(){
					alert('点击我2');
				})
			}
		</script>
		<button>点击</button>  
	</body>
</html>

注:
有了window.onload就可以把JS代码写到页面元素的上方,因为onload是等页面元素全部加载完毕,再去执行处理函数
window.onload传统注册事件方式只能写一次,如果有多个,会以最后一个window.onload为准
如果使用addEventListener,则没有限制

DOMContentLoaded事件
语法:

document.addEventListener('DOMContentLoaded',function(){})

DOMContentLoaded事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等
如果页面的图片很多,从用户访问到onload触发可能需要较长时间,交互效果就不能实现,必然影响用户体验,此时用DOMContentLoaded事件比较合适
例:

<html>
	<body>
		<script>
			window.onload = function(){ 
				var btn = document.querySelector('button');
				btn.addEventListener('click',function(){
					alert('点击我1');
				})
			}

			window.onload = function(){ //以该onload为准
				var btn = document.querySelector('button');
				btn.addEventListener('click',function(){
					alert('点击我2');
				})
			}
			
			document.addEventListener('DOMContentLoaded',function(){
				alert(333);
			})
		</script>
		<button>点击</button>   //先弹出333,再弹出点击我2
	</body>
</html>

◆ 调整窗口大小事件

通过window.onresize调整窗口大小加载事件

语法:

window.onresize = function(){}

或者

window.addEventListener('resize',function(){})

注:
只要窗口大小发生像素变化,就会触发这个事件
经常利用该事件完成响应式布局,window.innerWidth 当前屏幕的宽度

例:

<html>
	<body>
		<script>
			window.onload = function(){ 
				var div = document.querySelector('div');
				window.addEventListener('resize',function(){
					var width = window.innerWidth;
					if(width <= 800){
						div.style.display = null;
					} else {
						div.style.display = block;
					}
				})
			}
		</script>
		<div></div>
	</body>
</html>

■ 定时器

window对象提供了以下两个定时器方法
 ▶ setTimeout()
 ▶ setInterval()

□ setTimeout()

通过**setTimeout()**方法,设定一个定时器,该定时器在定时器到期后执行调用函数

语法:

window.setTimeout(调用函数[,延迟的毫秒数]);

例:

<html>
	<body>
		<script>
			window.setTimeout(function(){  //window在调用时,可以省略,可以直接写setTimeout
				console.log('2秒时间到了');
			}, 2000); //时间单位是毫秒,如果胜省略,则默认是0,即立即执行
			

			//还可以通过有名函数方式调用
			window.setTimeout(callBack, 3000); //时间单位是毫秒,如果胜省略,则默认是0,即立即执行
			function callBack(){
				console.log('3秒时间到了');
			}
			
			window.setTimeout('callBack()', 4000);  //函数可以通过字符串形式调用,但是不提倡
			
			//页面中可能有很多定时器,通常给定时器加标识符,用于区别不同的定时器
			var timer1 = setTimeout(callBack, 3000);
			var timer2 = setTimeout(callBack, 3000);
		</script>

	</body>
</html>

◆ 回调函数

setTimeout()方法中的函数称为回调函数 callBack
普通函数是按照代码顺序直接调用
回调函数需要等待时间,时间到了采取执行,因此称为回调函数
简单理解,回调就是回头调用的意思,上一件事干完,再回头调用这个函数

以下都是回调函数

element.onclick = function(){}
element.addEventListener('click',fn)

◆ clearTimeout

通过clearTimeout,来停止setTimeout定时器

语法:

window.clearTimeout(timeID)

例:

<html>
	<body>
		<button>点击停止定时器</button>
		<script>
			

			var timer = setTimeout(function(){
				alert('定时器启动');
			},5000)
		
			var btn = document.querySelector('button');
			
			btn.addEventListener('click',function(){
				clearTimeout(timer);
			})
		</script>

	</body>
</html>

□ setInterval()

通过**setInterval()**方法,重复调用一个函数,每隔这个时间,就去调用一次回调函数
使用方法同setTimeout,但setTimeout是只调用一次,而setInterval调用多次

语法:

window.setInterval(调用函数[,延迟的毫秒数]);

◆ clearInterval()

取消了先前通过调用setInterval建立的定时器

<html>
	<body>
		<button class='beginTimer'>开始定时器</button>
		<button class='stopTimer'>停止定时器</button>
		<script>
			var btn1 = document.querySelector('.beginTimer');
			var btn2 = document.querySelector('.stopTimer');
			console.log(btn1);
			var timer = null;
			btn1.addEventListener('click',function(){
				timer = setInterval(function(){
					console.log('定时器已开启');
				},1000);
			})
	
			btn2.addEventListener('click',function(){
				clearInterval(timer);
			})
		</script>
	</body>
</html>

■ this指向问题制

this的指向在函数定义时是确定不了的,只有函数执行的时候才能确定
一般情况,this的最终指向是那个调用该函数的对象

在全局作用域或普通函数中,this指向全局对象window(注意定时器里面的this指向window)

例1:

console.log(this); //输出:window

例2:

function fn(){
	console.log(this);
}
fn();  //输出:window,实际相当于window.fn();

例3:

setTimeout(function(){
	console.log(this);  //输出:window
},1000)

例4:
this指向方法的调用者

var o = {
	sayHi:function(){
		console.log(this);  
	}
}
o.sayHi(); //输出:window

例5:

<html>
	<body>
		<button>点击</button>
		var btn = document.querySelector('button');
		
		btn.onclick = function(){
			console.log(this); //输出:<button>点击</button>
		}

		btn.addEventListener('click',function(){
			console.log(this); //输出:<button>点击</button>
		})
		
		//构造函数中this指向构造函数的实例
		function Fun(){
			console.log(this);
		}
		var fun = new Fun(); //this 指向的是实例对象fun
	</body>
</html>

■ JS执行机制

□ JS执行队列

JS语言的特点是单线程,也就是说,同一个时间只能做一件事
这是由于JS诞生的使命所致,JS是为处理页面中的交互,以及操作DOM而诞生的
比如对某个DOM元素进行添加和删除操作,只能先进行添加,再进行删除

单线程意味着所有的任务都需要排队,前一个任务结束,才会执行下一个任务
这样就导致,如果JS执行时间过长,就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉

为解决这个问题,利用CPU多核计算能力,HTML5提出Web Worker标准,允许JS脚本创建多个线程,于是JS出现了同步和异步

□ 同步和异步

同步
前一个任务结束后再执行后一个任务,程序的执行顺序和任务排列的顺序是一致的,同步的

异步
在做一件事时,因为这件事会花很长时间,在做这件事的同时,你还可以去处理其他事

同步任务
同步任务都在主线程上执行,形成一个执行栈

异步任务
JS的异步是通过回调函数实现的
一般而言,异步任务有以下三种类型
 ▶ 普通事件,如click,resize等
 ▶ 资源加载,如load,error等
 ▶ 定时器,包括setInterval,setTimeout等
异步任务相关回调函数添加到任务队列当中(任务队列也称为消息队列)

□ JS执行机制

1 先执行执行栈中的同步任务
2 异步任务(回调函数)放入任务队列中
3 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行

□ 事件循环

由于主线程不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为事件循环(event loop)

■ location对象

window对象提供了一个local属性,用于获取或设置窗体的URL,并且可以用于解析URL
因为这个属性返回的是一个对象,所以该属性也称为location对象

□ location对象的属性

location.href
获取或设置整个URL

location.host
返回主机名或域名

location.port
返回端口号,如果未写,则返回空字符串

location.pathname
返回路径

location.search
返回参数

location.hash
返回片段,常见于链接或锚点

例:

<html>
	<body>
		<button>点击现在跳转</button>
		<div></div>
		<script>
			var btn = document.querySelector('button');
			var div = document.querySelector('div');

			btn.addEventListener('click',function(){
				location.href = 'http:\\www.baidu.com';
			})
			
			var timer = 5;
			setInterval(function(){
				if(timer == 0){
					location.href = 'http:\\www.baidu.com';
				} else {
					div.innerHTML = '您将在' + timer + '秒内跳转到新页面';
					timer--;
				}
			},1000)
		</script>
	</body>
</html>

□ location对象的方法

location.assign()
跟href一样,可以跳转页面,也称为重定向页面

location.replace()
替换当前页面,因为不记录历史,所以不能后退

location.reload()
重新加载页面,相当与刷新按钮,或者f5,如果参数为true,强制刷新ctrl + F5

例:

<html>
	<body>
		<button>点击现在跳转</button>
		<div></div>
		<script>
			var btn = document.querySelector('button');
			var div = document.querySelector('div');
			

			btn.addEventListener('click',function(){
				location.href = 'http:\\www.baidu.com';
			})
			
			var timer = 5;
			setInterval(function(){
				
				if(timer == 0){
					location.href = 'http:\\www.baidu.com';
				} else {
					div.innerHTML = '您将在' + timer + '秒内跳转到新页面';
					timer--;
				}
				
			},1000)
		</script>
	</body>

</html>

■ nagvigator对象

包含了浏览器相关信息,有很多属性
常用属性为userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值

■ history对象

用于与浏览器历史记录进行交互,该对象包含用户(在浏览器窗口中)访问过的URL
back()
后退功能

forward()
前进功能

go(参数)
前进后退功能,如果是1前进一个页面,如果是-1,后退一个页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值