- 事件,是文档或浏览器窗口中发生的一些特定的交互瞬间,JS与HTML之间的交互是通过事件实现的

对于web应用来说,有下面这些代表性事件:点击事件,鼠标移动,按下键盘等等

- 事件,是用户和浏览器之间的交互行为

我们可以在事件对应的属性中设置一些js代码,当事件被触发时,这些代码会执行

文档的加载:

浏览器在加载一个页面时,是按照自上而下的顺序加载的,

读取到一行就运行一行,在代码执行时,页面还没有加载

将js代码编写到页面的下面,确保页面加载完毕以后再执行js代码

window.onload 确保页面加载完成以后执行,可以保证代码执行时所有DOM对象已经加载完毕了

clientWidth/clientHeight:

- 可以获取元素的可见宽度和高度

- 这些属性都是不带px的,返回都是一个数字,可以直接进行计算

- 会获取元素宽度和高度,包括内容区和那边距

- 这些属性都是只读的,不能修改

事件对象:

当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实參传递进响应函数

在事件对象中封装了当前事件相关的一切信息,比如:鼠标的坐标,键盘哪个按键被按下

 <div id="areaDiv">
</div>
<br>
<br>
<div id="showMsg">
</div>
<script>
/**
* 当鼠标在areaDiv中移动时,在showMsg来显示鼠标的坐标
onmousemove
- 该事件将会在鼠标在元素中移动时被触发
*/
var area=document.getElementById('areaDiv')
var show=document.getElementById('showMsg')
if(!event){
event=window.event}//event=event||window.event
area.onmousemove=function(event){
/**
* clientX可以获取鼠标指针的水平坐标
clientY可以获取鼠标的垂直坐标,在ie8中不兼容
*/
show.innerHTML='x='+event.clientX+',Y='+event.clientY
}
</script>

⚠️:

在ie8中,响应函数被触发时,浏览器不会传递事件对象

在ie8及以下的浏览器中,是将事件对象作为window对象的属性保存的

事件冒泡:

所谓冒泡就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发

在开发中大部分情况冒泡都是有用的,如果不希望发生事件冒泡可以通过事件对象来取消

  <div id="box1">
我是box1
<span id='s1'>我是span</span>
</div>
<script>
var s1=document.getElementById('s1');
var box1=document.getElementById('box1');
s1.onclick=function(event){
event=event||window.event
alert('s1 here')
event.cancelBubble=true
}
box1.onclick=function(){
event=event||window.event
alert('box1 here')
event.cancelBubble=true//取消冒泡
}
document.body.onclick=function(){
alert('body here')
}
</script>

事件的委派:

- 将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件

- 事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能

  <button id="btn">添加超链接</button>
<ul id="ul">
<li><a href="javascript:;" class="link">超链接一</a></li>
<li><a href="javascript:;" class="link">超链接二</a></li>
<li><a href="javascript:;" class="link">超链接三</a></li>
</ul>
<script> var ul=document.getElementById('ul')
var btn=document.getElementById('btn')
btn.onclick=function(){
var li=document.createElement('li');
li.innerHTML="<a <li><a href='javascript:;' class='link'>超链接</a></li>"
ul.appendChild(li)
}
/**
*为每个超链接都绑定一个单击响应函数
这些操作只能为已经有的超链接设置事件,为新添加的超链接必须重新绑定
*/
/**
* var allA=document.getElementsByTagName('a');
for(var i=0;i<allA.length;i++){
allA[i].onclick=function(){
alert('我是a')
}
}
*/
/**
* 我们希望,只绑定一次事件,即可应用到所有元素上,即使元素是后添加的
我们可以尝试将其绑定给元素的共同祖先元素
*/
//为ul绑定一个单击响应函数
ul.onclick=function(event){
event=event||window.event
//如果触发事件的对象是我们期望的对象,则执行否则不执行
/**
target
*event的target表示触发事件的对象
*/
// alert(event.target)
if(event.target.className=='link')
{
alert('我是a')
}
}

事件的绑定:

使用:
- 对象.事件=函数形式绑定响应函数,它只能同时为一个元素的一个事件绑定响应函数,不能绑定多个,如果绑定了多个,则后边的会覆盖前边的
 - addEventListener() 通过这个方法也可以为元素绑定响应函数
    -参数:
       - 事件的字符串,不要on
       -  回调函数,当事件触发时该函数会被调用
       -  是否在捕获阶段触发事件,需要一个布尔值,一般都传false
⚠️:
- addEventListener()可以同时为一个元素的相同事件同时绑定多个响应函数,这样当事件被触发时,会按照函数的绑定顺序执行(ie8及以下浏览器不支持
- 绑定的事件对象

<button id="btn">click</button> var btn=document.getElementById('btn') btn.addEventListener("click",function(){
alert(1)
},false)
btn.addEventListener("click",function(){
alert(2)
},false)
attachEvent()
- 在ie8中可以使用attachEvent()来绑定事件
- 参数:
       - 事件的字符串,要on
       -  回调函数,当事件触发时该函数会被调用
⚠️:
- 后绑定的事件,先执行
- this是window
 
<button id="btn">click</button>

var btn=document.getElementById('btn')

  btn.attachEvent("onclick",function(){
alert(1)
},false)
btn.attachEvent("onclick",function(){
alert(2)
},false)

定义一个函数,用来为指定元素绑定响应函数

参数:

obj 要绑定的对象

eventStr 事件的字符串(不要on)

callback 事件的回调函数

  var btn=document.getElementById('btn')
function bind(obj,eventStr,callback){
if(obj.addEventListener){
//大部分兼容的方式
obj.addEventListener(eventStr,callback,false)
}
else{
/**
* this是谁,由调用方式决定
callback.call(obj)
*/
//ie8及以下
// obj.attachEvent("on"+eventStr,callback)//callback由浏览器调用,this对象指向浏览器,
//可以把上一句改成:
obj.attachEvent("on"+eventStr,function(){
callback.call(obj)//obj传入参数,代替this指向
})
}
}
bind(btn,"click",function(){
alert('hello')
})

事件的传播:

- 关于事件的传播有两种说法:

1.事件是从内往外传播,也就是当事件触发时,应该先触发当前元素上的事件,然后再向当前元素的祖先元素上传播,也就是说事件应该再冒泡阶段执行

2.事件是由外向内传播,也就是先是当前元素的最外层祖先元素触发,然后在向内传递给后代元素

w3c综合了两种说法,将事件分成了3个阶段:

- 捕获阶段

在捕获阶段是从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件

- 目标阶段

事件捕获到目标元素,捕获结束开始在目标元素上触发事件

- 冒泡阶段

事件从目标元素向他的祖先元素传递,依次触发祖先元素上的事件

⚠️:

- 如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true(一般不会有人这么做

- ie8没有捕获阶段

JS中的事件(对象,冒泡,委托,绑定)的更多相关文章

  1. JS中的事件&对象

    一.JS中的事件 (一)JS中的事件分类 1.鼠标事件 click/dblclick/onmouseover/onmouseout 2.HTML事件 onload/onscroll/onsubmit/ ...

  2. js中获取事件对象的方法小结

    原文地址:http://jingyan.baidu.com/article/d8072ac4594d6cec95cefdac.html 事件对象 的获取很简单,很久前我们就知道IE中事件对象是作为全局 ...

  3. 和我一起理解js中的事件对象

    我们知道在JS中常用的事件有: 页面事件:load: 焦点事件:focus,blur: 鼠标事件:click,mouseout,mouseover,mousemove等: 键盘事件:keydown,k ...

  4. JS 学习笔记--JS中的事件对象基础

    事件:JavaScript中的事件是由访问web页面用户的一系列操作引起的,比如点击鼠标,键盘按键等.当用户执行某些操作的时候再去执行一些代码. 事件模型:内联模型.脚本模型.DOM2模型 内联模型: ...

  5. js中的事件代理(委托)

    1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这 ...

  6. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  7. JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

       前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...

  8. js中的事件委托(事件代理)详解

    本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...

  9. js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象

    事件对象    在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...

随机推荐

  1. 负载均衡集群相关、LVS介绍、LVS调度算法、LVS NAT模式搭建

    1.负载均衡集群相关 2.LVS的三种模式:NAT.DR .IP tunnel 3. LVS的调度算法(共有8种) 4.LVS NAT模式搭建准备条件:   在分发服务器上安装:yum install ...

  2. psql的安装与数据库创建(ubuntu)

    来自阮一峰日志 http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql --------------------- ...

  3. asp.net服务器控件button先执行js再执行后台的方法

    服务器控件增强了在后台处理的能力,但是在前台有时候也被受到了限制. 关于button这个服务器控件,我一直想减少它向服务器提交数据.那些检测,还是在客户端实现就好了.这就需要javascript,但是 ...

  4. 使用新标签兼容低版本IE

    HTML语义化 意义:根据内容的结构化(语义化),选择合适的标签,便于开发者阅读和写出更优雅的代码,同时让流浪器的爬虫和机器更好的解析. 尽可能少的使用无语义的标签 div 和 span 在语义不明显 ...

  5. dubbo 熔断,限流,降级

    1 写在前面 1.1 名词解释 consumer表示服务调用方 provider标示服务提供方,dubbo里面一般就这么讲. 下面的A调用B服务,一般是泛指调用B服务里面的一个接口. 1.2 拓扑图 ...

  6. c++ CreateProcess调用dos命令

    // test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include &l ...

  7. 二进制 转换成十进制 BCD码(加3移位法)

    "原来的二进制数十几位,则左移时就要左移几位" "二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位 ...

  8. ubuntu安装nginx及其默认目录结构

    一. 安装包安装 1.1 安装Nginx $sudo apt-get install nginx Ubuntu安装之后的文件结构大致为: 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经 ...

  9. Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...

  10. 一切为了落地,为什么要把PP.io设计成三个阶段!

    之前的一篇文章,我讲解了PP.io的三个阶段:“强中心”,“弱中心”,“去中心”.今天来解释下,我为什么要分三个阶段逐步实现PP.io去中心化存储网络: 简单地说,就是在区块链不可能三角理论中,我暂时 ...