JS.3-BOM,window对象常见事件, 定时器, JS执行队列, location对象, navigator对象, history对象

目录

一.BOM概述

1.概念:

2.DOM和BOM比较 

​3.BOM构成

二.window对象常见事件

1.窗口加载事件

(1)window.onload

(2)addEventListener

(3)DOMContentLoaded

2.调整窗口大小事件

(1)window.onresize

(2)resize

三.定时器

1.setTimeout()

回调函数callback

2.clearTimeout()

3.setInterval()

4.clearInterval()

5.this

四.JS执行队列

1.JS是单线程

2.同步和异步

(1)同步

(2)异步

3.JS执行机制 

​编辑4.事件循环 

五.location对象

1.简介

(1)概念

(2)URL

 2.对象属性

3.对象方法 

六.navigator对象

1.概念

2.作用

七.history对象


一.BOM概述

1.概念:

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

2.DOM和BOM比较 

81229db5d0f641b383a537ae828365bd.png3.BOM构成

window对象是浏览器的顶级对象, 双重角色:

  • 是JS访问浏览器窗口的一个接口
  • 是一个全局对象, 定义在全局作用域中的变量,函数都会变成 window 对象的属性和方法,在调用的时候可以省略 window,对话框都属于 window 对象方法,如 alert()、prompt() 等。

注意:

  • window下的一个特殊属性 window.name   打印返回空的字符串
  • BOM包含DOM,   完整写法:  window.document.querySelector();

29e076302267442db0b75290acc275ee.png

二.window对象常见事件

1.窗口加载事件

(1)window.onload

  • window.onload = function(){} ; 
  • 当页面内容完全加载完成之后会触发该事件(含图像,脚本文件,css,文件等),就调用的处理函数
  • 传统注册事件方式,只能写一次,若有多个,以最后一个 window.onload 为准,前边的都会被覆盖

(2)addEventListener

  • window.addEventListener("load",function(){}); 
  • 不会被覆盖,多个也可生效,无限制

(3)DOMContentLoaded

  • document.addEventListener('DOMContentLoaded',function(){}); 
  • 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等. Ie9以上才支持
  • 若页面的图片很多的话, 从用户访问到onload触发可能需要较长的时间, 交互效果就不能实现,必然影响用户的体验,此时用 DOMContentLoaded 事件比较合适

2.调整窗口大小事件

(1)window.onresize

  • window.onresize = function(){}; 调整窗口大小加载事件,当触发时就调用的处理函数
  • 只要窗口大小发生像素变化,就会触发这事件
  • 响应式布局,  window.innerWidth 当前屏幕的宽度;  window.innerHeight 当前屏幕的高度

(2)resize

  • window.addEventListener("resize",function(){});

三.定时器

1.setTimeout()

window.setTimeout(调用函数,[延迟的毫秒数]);     设置一个定时器,在定时器到期后执行调用函数

注意:

  • window 可以省略,  延迟的毫秒数单位毫秒, 省略默认是0
  • 写法: ①写函数,②写函数名,③字符串形式函数名 '函数名()'   但不提倡
  • 定时器可能有很多,可给定时器赋值一个标识符,实现多个定时器

回调函数callback

  • 普通函数是按照代码顺序直接调用.
  • 回调函数,需要等待时间,时间到了才去调用这个函数,因此称为回调函数。(回头调用, 上一件事干完,再回头再调用这个函数)
  • element.onclick = function(){}   或者  element.addEventListener(“click”, fn);    里面的函数setTimeout() 都是回调函数。

2.clearTimeout()

window.clearTimeout(timeoutID);     停止setTimeout()建立定时器

注意:   window 可以省略;  里面的参数就是定时器的标识符 

3.setInterval()

 window.setInterval(回调函数, [间隔的毫秒数]);    间隔时间,就反复调用一次回调函数

注意:

  • window 可以省略,  间隔的毫秒数单位毫秒, 间隔多久就调用一次这个函数, 省略默认是0
  • 写法: ①写函数,②写函数名,③字符串形式函数名 '函数名()'   但不提倡
  • 定时器可能有很多,可给定时器赋值一个标识符,实现多个定时器
  • 第一次执行也是间隔毫秒数之后执行,之后每隔毫秒数就执行一次

4.clearInterval()

 window.clearInterval(intervalID);   取消setInterval()建立的定时器

注意:   window 可以省略;  里面的参数就是定时器的标识符

    <button class="btn1">clearTimeout</button>
	<button class="btn2">clearInterval</button>
	<script>
		// 1. window.setTimeout(调用函数,延时时间);  调用时,window可省  延时时间单位毫秒,省略默认为0
		// 方法1   写函数  
/* 		setTimeout(function(){  
			console.log('时间到了')
		},2000); 
		//方法2  写函数名
		setTimeout(callback,3000);  
		function callback(){
			console.log('爆炸!!!!!!!!')
		};
		// 方法3   字符串形式函数名 '函数名()'   不提倡
		setTimeout('callback()',9000);
		//    给赋标识符,就可以实现多个定时器
		var time1 = setTimeout(callback,5000); 
		var time2 = setTimeout(callback,7000);
		 */
		
		// clearTimeout()  停止setTimeout()定时器
		var btn1 = document.querySelector('.btn1');
		var timer1 = setTimeout(function(){
			console.log('qqq');
		},2000);
		btn1.addEventListener('click',function(){
			clearTimeout(timer1);
			console.log('q');
		});
		
		// 2. setInterval(回调函数,[间隔毫秒数]);   间隔时间,反复调用一个函数
		/* setInterval(function(){
			console.log('33333')
		},2000); */
		
		// clearInterval()  停止setTimeout()定时器
		var btn2 = document.querySelector('.btn2');
		var timer2 = setInterval(function(){
			console.log('www');
		},2000);
		btn2.addEventListener('click',function(){
			clearInterval(timer2);
			console.log('w');
		});

5.this

this指向问题:  一般情况,this最终指向那个调用他的对象

  • 全局作用域 或 普通函数中this指向全局对象window (注意:定时器中的this指向window)
  • 方法调用中this指向调用者这个对象
  • 构造函数this指向构造函数的实例(new开辟空间,创建空对象,this指向新的空对象,实例化后赋值给实例对象,故this指向实例对象)
    		<!-- this指向问题   一般情况,this最终指向那个调用他的对象 -->
    		<script>
    			// 1.全局作用域 或 普通函数中this指向全局对象window (注意:定时器中的this指向window)
    			console.log(this);  //指向Window对象
    			function fn(){
    				console.log(this); //指向Window对象
    			}
    			window.fn();   //window可省
    			setTimeout(function(){
    				console.log(this);   //指向Window对象
    			},1000);
    			
    			// 2.方法调用中this指向
    			var a = {
    				sayHi: function(){
    					console.log(this);  //指向调用者a这个对象
    				}
    			}
    			a.sayHi();
    			var btn = document.querySelector('button');
    			btn.onclick = function(){
    				console.log(this);  //指向btn按钮对象
    			}
    			
    			// 3. 构造函数this指向构造函数的实例
    			function Fun(){
    				console.log(this); //指向fun实例对象
    			}
    			var fun = new Fun();  //new开辟空间,创建空对象,this指向新的空对象,实例化后赋值给标识符fun,故this指向fun
    		</script>

四.JS执行队列

1.JS是单线程

  • JavaScript 语言的一大特点就是单线程, 同一个时间只能做一件事。
  • 因为JavaScript 是为处理页面中用户的交互,以及操作 DOM 而诞生的。e.g: 对某个 DOM 元素进行添加和删除操作,不能同时进行, 应该先进行添加,之后再删除
  • 单线程意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.
  • 这样所导致的问题是: 如果 JS 执行的时间过长,就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉

2.同步和异步

  • 利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程. 于是,JS 中出现了同步和异步
  • 本质区别: 这条流水线上各个流程的执行顺序不同

(1)同步

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

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

(2)异步

做一个任务的同时,也可去处理其他任务

异步任务: JS 的异步是通过回调函数实现的,  一般而言,异步任务有以下三种类型:

  • 普通事件,如 click、resize 等
  • 资源加载,如 load、error 等
  • 定时器,包括 setInterval、setTimeout 等

异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)

3.JS执行机制 

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

5f8d4ff0a6b0469e842d9484bffff8d9.png4.事件循环 

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

d627e32a451548a7a77991505a73b3dc.png

五.location对象

1.简介

(1)概念

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

(2)URL

  • 统一资源定位符 (Uniform Resource Locator, URL) 是互联网上标准资源的地址
  • 互联网上的每个文件都有一个唯一的 URL,包含的信息指出文件的位置以及浏览器应该怎么处理它
  • URL 的一般语法格式为:  protocol://host[:port]/path/[?query]#fragment     e.g: http://www.itcast.cn/index.html?name=andy&age=18#link

88cfd920475c46199701dbaf6ab110a2.png

 2.对象属性

6e7c010b27b8432aa89315bde74afd27.png

3.对象方法 

6abf9a15959348c6a97804a602be8e7f.png

六.navigator对象

1.概念

  • navigator 对象包含有关浏览器的信息,它有很多属性, 最常用userAgen,该属性可以返回由客户机发送服务器的 user-agent 头部的值

2.作用

可实现手机端和PC端页面不同

if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
    window.location.href = "";     //手机
 } else {
    window.location.href = "";     //电脑
 }

七.history对象

与浏览器历史记录进行交互(模拟前进后退按钮). 该对象包含用户(在浏览器窗口中)访问过的 URL

ba19716fb68249439d19c960b8759fb9.png

 

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mteee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值