JavaScript学习基础笔记06
javascript学习笔记——事件高级,BOM浏览器对象模型
- 注册事件(绑定事件)
- 删除事件(解绑事件)
- DOM事件流
- 事件对象
- 阻止事件冒泡
- 事件委托(代理,委派)
- 常用的鼠标事件
- 常用键盘事件
一、事件高级
注册事件(绑定事件):给元素添加事件
- 注册事件的两种方式:
传统方式
,方法监听注册方式
- 传统方式:
- 以on开头的事件,如onclick
特点:
注册事件的唯一性- 同一个元素,同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数。
- 方法监听注册方式:
addEventListener()
是一个方法 。- IE9之前的IE浏览器不支持,可以使用
attachEvent()
代替 特点:
同一个元素,同一个事件可以注册多个监听器- 按照注册顺序依次执行
eventTarget.addEventListener(type,listener,useCapture)
将指定的监听器注册到eventTatget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。type:
事件类型字符串,比如click,mouseover等。listener:
事件处理函数,事件发生时会调用该函数。useCapture:
可选参数,是一个布尔值,默认为false。eventTarget.attachEvent(eventNameWithOn,callBack)
将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定回调函数就会被执行。(作为了解)eventNameWithOn
事件类型字符串,比如click,mouseover等callback
事件处理函数,当目标触发事件时回调函数被调用。
- 注册事件的两种方式:
删除事件
- 传统注册事件的删除事件:
- eventTarget.onclick=null;
- 方法监听注册方式
- eventTarget.removeEventListener(type,listener,useCapture)
- eventTarget.detachEvent(eventNameWithOn,callBack)
- 传统注册事件的删除事件:
DOM事件流
事件流是描述从页面中接收事件的顺序,事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程叫做DOM事件流。
DOM事件流分为三个阶段:
- 捕捉阶段
- 当前目标阶段
- 冒泡阶段
- 事件冒泡:IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程。
- 事件捕获:网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程。
注:
(1)JS代码中只能执行捕获或者冒泡其中的一个阶段; (2)onclick
和attachEvent
只能得到冒泡阶段。 (3)eventTarget.addEventListener(type,listener,useCapture)
第三个参数如果是true表示在事件捕捉阶段调用事件处理函数,如果是false(默认),表示在事件冒泡阶段调用事件处理函数。实际开发中更加关注冒泡,事件捕获很少关注。有些事件没有冒泡,比如:onblur,onfocus,onmouseenter,onmouseleae
事件对象
- event就是一个事件对象,写在监听函数的小阔号中,当形参来看。
- 事件对象只有有了事件才会存在。它是系统给我们自动创建的。不需要我们传递参数。
- 事件对象是事件的一系列相关数据的集合,跟事件相关,如果是鼠标事件,就包含了鼠标的相关信息,比如鼠标坐标等。
- 这个事件对象可以自己命名:event, evt , e 等
兼容性问题:
对于IE6,7,8 只有通过window.event获取。e=e||window.event
兼容性写法- 事件对象常见的属性和方法
事件对象属性方法 说明 e.target 返回触发事件的对象 (标准) e.srcElement 返回触发事件的对象 (非标准 IE6,7,8使用) e.type 返回事件类型 比如click,mouseover等 e.cancelBUbble 该属性阻止冒泡 (非标准 IE6,7,8使用) e.returnValue 该属性阻止默认事件(默认行为),比如不让连接跳转(非标准 IE6,7,8使用) e.preventDefault() 该属性阻止默认事件(默认行为),比如不让连接跳转 标准 e.stopPropagation() 阻止冒泡 标准
阻止事件冒泡
- 事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点。
e.stopPropagation()
标准写法e.cancelBUbble=true;
非标准 IE6,7,8使用
事件委托(代理,委派)
- 事件委托也称为事件代理,在jQuery里面称为事件委派。
事件委托的原理*
:不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个节点。
鼠标事件
- 常用的鼠标事件:
- 禁止鼠标右键菜单:
contextmenu
主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单。1
2
3document.addEventListener('contextmenu',function(e){
e.preventDefault();
}) - 禁止鼠标选中(selectstart 开始选中)
1
2
3document.addEventListener('selectstart',function(e){
e.preventDefault();
})
- 禁止鼠标右键菜单:
- 鼠标事件对象
event
对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要使用鼠标事件对象MouseEvent
和键盘事件对象KeyboardEvent
鼠标事件对象 说明 e.clientX 返回鼠标相对于 浏览器窗口可视区
的X
坐标e.clientY 返回鼠标相对于 浏览器窗口可视区
的Y
坐标e.pageX 返回鼠标相对于 文档页面
的X
坐标 IE9+z支持e.pageY 返回鼠标相对于 文档页面
的Y
坐标 IE9+z支持e.screeX 返回鼠标相对于 电脑屏幕
的X
坐标e.screeY 返回鼠标相对于 电脑屏幕
的Y
坐标
- 常用的鼠标事件:
键盘事件
- 常用的键盘事件
键盘事件 触发条件 onkeyuo 某个键盘案件被松开时触发 onkeydown 某个键盘按键被按下时触发 onkeypress 某个键盘按键被按下时触发 但它不识别功能键 比如ctrl shift箭头等
- 三个事件的执行顺序 keydown-> keypress-> keyup
- 键盘事件对象
键盘事件对象 (属性) 说明 keyCode 返回该键的ASCLL码值 keyup
和keydowm
通过keyCdoe获取按键的ASCALL码值时是不区分大小写的(a和A都是得到65),只有keypress
才区分大小写。keypress
和keydown
在文本框里面的特点:它们两个事件触发的时候,文字还没有落入到文本框中。keyup
事件触发的时候,文字已经落入到文本框中
- 常用的键盘事件
二、BOM浏览器对象模型
- BOM是浏览器对象模型,它提供了独立于 内容而与
浏览器窗口进行交互
的对象,其核心对象是window- 浏览器对象模型
- 把
浏览器
当作一个对象
来看待 - BOM的顶级对象是
window
- BOM学习的是浏览器窗口交互的一些对象
- BOM是浏览器厂商在各浏览器上定义的,兼容性差。
- BOM构成
- 是JS访问浏览器窗口的一个接口
- 是一个全局对象,定义在全局作用域中的一个变量、函数 都会变成window对象的属性和方法 。在调用的时候可以省略window
- window对象常见的事件
- 窗口加载事件:当文档内容完全加载完成之后会触发该事件(包括图像,脚本文件,CSS 文件等),就调用的处理函数。
1
2
3window.onload=function();
//或者
window.addEventListener('load',function(){})- 使用 window.onload 传统方法只能注册一次,若多次注册则以最后一个为准
- 使用 window.addEventListener(‘load’,function(){}) 则没有次数限制,可以注册多个事件。
DOMcontentLoaded
事件触发时,仅当DOM加载完成,不包含样式表,图片,flash等等。(IE9+支持)1
document.addEventListener('DOMcontentLoaded',function(){})
- 调整窗口大小事件
window.onresize
是调整窗口大小加载事件,当触发时就调用处理函数。- 只要窗口像素变化就会触发这个事件。
- 经常利用这个事件来完成响应式布局,window.innerWidth当前屏幕的宽度。
- 窗口加载事件:当文档内容完全加载完成之后会触发该事件(包括图像,脚本文件,CSS 文件等),就调用的处理函数。
- 定时器
- 两种定时器:页面中可能存在多个计时器,通常会给计时器添加标志符来区别不同定时器。
setTimeout()
定时器,隔多少时间后调用里面的函数。只调用一次。setInterval()
每隔这个延迟时间,就调用一次这个回调函数。重复调用。
setTimeout()
1
window.setTimeout('调用函数',[延迟的毫秒数]); //[]可以省略
- 回调函数
- 停止setTimeout()计时器使用
window.clearTimeout(timeoutID)
1
2
3
4
5
6
7
8
9
10
11
12
13<body>
<button>点击停止倒计时</button>
</body>
<script type="text/javascript">
var btn=document.querySelector('button');
var timer=setTimeout(function(){
console.log("倒计时结束");
},5000);
btn.addEventListener('click',function(){
clearTimeout('timer');
console.log("倒计时停止!")
})
</script>
setInterval()
- 每隔设定的时间就会调用这个函数,可以用来做倒计时
- 用于做倒计时时会遇到刷新页面时没有时间显示,因为这个函数设置会在1秒后调用函数,因此我们可以在这个回调函数之前先调用一次时间显示函数,避免了刷新显示空白。
- 停止setInterval()定时器使用
clearInterval()
方法。参数为定时器的标识符。
this *
- this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的对象。
- 在
全局作用域
或者普通函数
中this指向全局对象window。(定时器里面的this指向window) 方法调用中
谁调用this指向谁。构造函数中
this指向构造函数的实例。
- 两种定时器:页面中可能存在多个计时器,通常会给计时器添加标志符来区别不同定时器。
- JS执行机制
- js是
单线程
的:JavaScript语言的一大特点是单线程,也就是说同一个时间只能做一件事
。- 单线程意味着所有任务均需要排队,前一个任务结束后才会执行后一个任务。这样可能会导致若JS执行时间过长,会造成页面渲染不连贯,页面渲染加载产生阻塞的感觉。
同步
和异步
- 为例解决页面加载阻塞的问题,利用多核CPU的计算能力,
HTML5
提出Web Worker标准,允许JavaScript脚本创建多线程,这样JS中就出现了同步
和异步
。 - 同步:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。
- 异步:在做一件事时,因为这个事情比较花时间,所以在做这件事的同时可以去处理其他任务。
1
2
3
4
5console.log(1);
setTimeout(function(){
console.log(2);
},1000);
console.log(3); //执行打印结果为 1,2,3; 属于异步执行。
- 为例解决页面加载阻塞的问题,利用多核CPU的计算能力,
- 同步任务:同步任务都是在主线程上执行,形成一个
执行栈
- 异步任务:JS的异步是通过回调函数实现的。一般而言,异步任务有如下三种类型
- 普通事件:如
click , resize
等 - 资源加载:如
load , error
等 - 定时器:包括
setInerval , setTimeout
等
- 普通事件:如
- JS执行机制
- 先执行
执行栈中的同步任务
- 异步任务(回调函数)放在任务队列中。
- 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈开始执行。
事件循环(even loop)
由于主线程不断地重复获得任务、执行任务、再获取任务、再执行。
- 先执行
- js是
- location对象
- window对象提供了一个
location属性
用于获取或设置窗体的URL
,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性称为location对象。 URL
:统一资源定位符(Uniform Resource locator)是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。- URL的一般语法格式为
protocol://host[:port]/path/[?query]#fragment
例如:http://www.itcast.cn/index.html?name=andy&age=19#link
组成 说明 protocol 通信协议,通常的http, ftp, maito等 host 主机(域名) port 端口号 (可选),省略时使用方案的默认端口号,如http默认端口号为80 path 路径
由 零或多个’/‘符号隔开的字符串,一般用来表示主机上的一个目录或文件地址query 参数 以键值对的形式,通过 &
符号分隔开fragment 片段 #
后面的内容常见于链接,锚点
- URL的一般语法格式为
- location对象的属性
location对象属性 返回值 location.href
获取或者设置整个URL location.host 返回主机(域名) location.port 返回端口号 如果未写返回空字符串 location.pathname 返回路径 location.search
返回参数 location.hash 返回片段 #
后面的内容常见于链接、锚点 - location对象中的方法
location对象方法 返回值 location.assign() 跟href一样也可以跳转页面(也称为重定向页面)记录历史可以后退页面 location.replace() 替换当前页面,因为不记录历史,所以不能后退页面 location.reload() 重新加载页面,相当于刷新按钮或者F5 如果参数为 true
则强制刷新,相当于ctrl+F5 - navigator对象
- navigator包含有关浏览器的信息,它有很多属性,常用的是
userAgent
,该属性可以返回由客户机发送服务器的user-agent头部值。 - 用于PC端和移动端的页面切换
- navigator包含有关浏览器的信息,它有很多属性,常用的是
- history对象
- window对象给我们提供history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL
history对象方法 作用 back() 可以后退功能 forward() 前进功能 go(参数) 前进后退功能 参数如果是1 则前进一个界面,参数如果是-1则后退一个界面
- window对象给我们提供history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL
- window对象提供了一个
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Another Dimension!
评论
ValineDisqus