一、Event对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

事件通常与函数结合使用,函数不会在事件发生前被执行!

当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细信息(包括导致事件的元素、事件的类型、以及其它与特定事件相关的信息等。这个对象是在执行事件时,浏览器通过函数传递过来的。)都会被临时保存到一个指定的地方——event对象,供我们在需要的时候调用

二、获取event对象

在 W3C 规范中,event 对象是随事件处理函数传入的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持这种方式;但是对于 IE8.0 及其以下版本,event 对象必须作为 window 对象的一个属性。

IE、Chrome:event是一个内置的全局对象

标准下/FF:事件对象是通过事件函数的第一个参数传入(如果一个函数是被事件调用的,那么这个函数定义的第一个参数就是事件对象)

如何处理兼容性:

document.onclick = function  fn(){var ev = ev||event;alert('处理兼容');
}

例子:

<script>window.onload = function(){var oDiv = document.getElementById('div1');document.onmousemove = function(ev){var ev = ev||event;//处理兼容性oDiv.style.left = ev.clientX + 'px';oDiv.style.top = ev.clientY + 'px';}}</script>

三、事件流

事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候而层叠在你点击范围 , 并不是只有当前被点击的元素会触发事件 , 那么你点击其中一个元素的所有元素都会触发事件。而如果我们想要只触发其中一个事件时,此时就需要取消冒泡或捕获。现代浏览器默认都是冒泡类型,所以通常只需要取消冒泡即可。

事件流包括两种模式:冒泡和捕获。

1、冒泡:从里向外逐个触发。当你使用事件冒泡时,子级元素先触发,父级元素后触发

事件冒泡机制:当一个元素接收到事件的时候,会把他接收的所有传播给他的父级,一直到顶层window

2、捕获:从外向里逐个触发(与事件冒泡机制相反)当你使用事件捕获时,父级元素先触发,子级元素后触发

W3C模型

W3C模型是将两者进行中和,在W3C模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。

阻止事件冒泡的方法

function stopBubble(e) {  if(e && e.stopPropagation){  e.stopPropagation();  //非IE下} else {  window.event.cancelBubble = true;  //IE下}
};  

四、js事件绑定

要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称。
在JavaScript中,有三种常用的绑定事件的方法:

  1. 在DOM元素中直接绑定;
  2. 在JavaScript代码中绑定;
  3. 绑定事件监听函数。

1、在DOM中直接绑定

<button onclick="open()">按钮</button><script>
function open(){alert(1);
}
</script>

2、在js代码中绑定

<button id="btn">按钮</button>document.getElementById('btn').onclick = function(){this.style.background = 'yellow';}

3、绑定事件监听函数

绑定事件的另一种方法是用 addEventListener() 或 attachEvent() 来绑定事件监听函数。

addEventListener()函数语法:
elementObject.addEventListener(eventName,handle,useCapture);

参数 说明
elementObject DOM对象(即DOM元素)。
eventName 事件名称。注意,这里的事件名称没有“ on ”,如鼠标单击事件 click ,鼠标双击事件 doubleclick ,鼠标移入事件 mouseover,鼠标移出事件 mouseout 等。
handle 事件句柄函数,即用来处理事件的函数。
useCapture Boolean类型,是否使用捕获,一般用false 。这里涉及到JavaScript事件流的概念,前面已经进行了讲解

attachEvent()函数语法:
elementObject.attachEvent(eventName,handle);

参数 说明
elementObject DOM对象(即DOM元素)。
eventName 事件名称。注意,与addEventListener()不同,这里的事件名称有“ on ”,如鼠标单击事件 onclick ,鼠标双击事件 ondoubleclick ,鼠标移入事件 onmouseover,鼠标移出事件 onmouseout 等。
handle 事件句柄函数,即用来处理事件的函数。

注意:事件句柄函数是指“ 函数名 ”,不能带小括号。
addEventListener()是标准的绑定事件监听函数的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数;但是,IE8.0及其以下版本不支持该方法,它使用attachEvent()来绑定事件监听函数。所以,这种绑定事件的方法必须要处理浏览器兼容问题。

下面绑定事件的代码,进行了兼容性处理,能够被所有浏览器支持:

<button id="btn">按钮</button><script type="text/javascript">var oBtn = document.getElementById('btn');function addEvent(obj,type,handle){try{ // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本obj.addEventListener(type,handle,false);}catch(e){try{ // IE8.0及其以下版本obj.attachEvent('on' + type,handle);}catch(e){ // 早期浏览器obj['on' + type] = handle;}}}addEvent(oBtn,'click',function(){//切记cliclk要加引号,没加会报错this.style.width = 200+'px';});
</script>
<span style="color:#ffcc33">这里使用 try{ ... } catch(e){ ... } 代替 if ... else... 语句,避免浏览器出现错误提示。</span>

注意:obj.addEventListener('click',fn,true);(从外到里)//告诉Obj,如果有一个进去的事件触发了你,你就去执行fn这个函数              obj.addEventListeren('click',fn,false);(从里到外)//告诉Obj,如果有一个出去的事件触发了你,你就去执行fn这个函数

总结一下就是:如果最后一个布尔值参数是true,就表示,在捕获阶段调用事件处理程序,如果是false,就表示在冒泡阶段调用事件处理程序

4、三种绑定事件的区别

第一种方式:函数写在结构层里面。非常不好,使页面很混乱,行为与结构得不到分离。并且在DOM结构如果绑定两个 "onclick" 事件,只会执行第一个;

第二种方式:行为与结构开始分离。第二种绑定方式中只能给一个时间绑定一个处理函数,在脚本通过匿名函数的方式绑定的只会执行最后一个事件。

第三种方式:可以绑定多次同一个事件,且都会执行

1. <div id="btn" onclick="clickone()" onclick="clicktwo()"></div> <script>function clickone(){ alert("hello"); } //执行这个function clicktwo(){ alert("world!"); }</script>2. <div id="btn"></div><script>document.getElementById("btn").onclick = function(){ alert("hello"); }document.getElementById("btn").onclick = function(){ alert("world"); } //执行这个</script>3. <div id="btn"></div><script>document.getElementById("btn").addeventlistener("click",clickone,false);function clickone(){ alert("hello"); } //先执行document.getElementById("btn").addeventlistener("click",clicktwo,false);function clicktwo(){ alert("world"); } //后执行</script>

5、如何取消事件绑定

第一种方式:document.onclick = null;(针对第一和第二两种绑定方式)

第二种方式:obj.detachEvent(事件名称,事件函数);(针对非标准IE下的绑定方式)

第三种方式:obj.removeEventListener(事件名称,事件函数,是否捕获);(针对标准浏览器下的绑定方式)

五、js事件委托

事件委托:利用事件冒泡的特性,将里层的事件委托给外层事件,根据event对象的属性进行事件委托,改善性能。

使用事件委托能够避免对特定的每个节点添加事件监听器;事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。(事件委托看起来挺难理解,但是举个生活的例子。比如,有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。)

<ul id="ul-item"><li class="item">item1</li><li class="item">item2</li><li class="item">item3</li><li class="item">item4</li>
</ul><script type="text/javascript">function fn(){var oUlItem = document.getElementById('ul-item');oUlItem.addEventListener('click',show,false);//添加监听事件function show(ev){var  ev = ev || window.event;var src = ev.target||ev.srcElement;//兼容IE下和FF下以及其他浏览器if(src && src.className.toLowerCase() === 'item'){//tolowerCase,将字符串全部转化为小写字母alert(src.innerHTML);}}};fn();
</script>

以下为补充知识(js的event.srcElement与event.target(触发事件源))

IE下,event对象有srcElement属性,但是没有target属性;

Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的,即:

firefox 下的 event.target = IE 下的 event.srcElement

解决方法:使用obj = event.srcElement ? event.srcElement : event.target;

或:var evtTarget = event.target || event.srcElement;

js将html的所有控件都看成是一个个对象,通过js的各个属性,就能对其进行操作处理,js里对象的整体结构是树形的结构。一层一层的追溯,即可获取需要的结果。

event.srcElement:表示的当前的这个事件源。

event.srcElement.parentNode:表示当前事件源的父节点。

parentNode:父节点,也就是上一层的节点。可以是任何一个标签。

event.srcElement.firstChild:当前事件的第一个节点,如果节点是input,通过event.srcElement.firstChild.value就可以获取此input的值。

event.srcElement.parentElement:是指在鼠标所在对象的上一个对象。

event.srcElement.children:当前节点下对象的个数,有多个的话就是个数组,如当前节点下有2个input的对象,要获取这两个可以用event.srcElement.children[0] 与 event.srcElement.children[1]分别获取。

js中事件对象event相关推荐

  1. js中事件对象event的兼容性问题

    W3C标准规定,事件是作为函数的参数传入的,例如: <p id="demo">点击我将获得屏幕坐标</p> document.getElementById( ...

  2. 关于js中事件的event.stopPropagation()方法的理解与举例说明

    event.stopPropagation() 阻止捕获和冒泡阶段中当前事件的进一步传播. 在这之前先说一下事件触发的原理 事件触发原理 事件触发整体有三个阶段构成:捕获阶段 -> 目标阶段(不 ...

  3. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  4. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  5. js的三大家族(offset/scroll/client)和一个事件对象(event)///正则

                  一  offset 第1章 offset家族 4 1.1 三大家族和一个事件对象 4 1.2 Offset家族简介 4 1.2.1 offsetWidth和offsetHi ...

  6. javaScript中的事件对象event是怎样

    事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...

  7. JS事件对象 (event)

    #事件对象 (event) div.onclick = function(event){         console.log(event);         let e = event||wind ...

  8. JS的事件对象和事件冒泡

    2019独角兽企业重金招聘Python工程师标准>>> 1.事件对象 js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源.事件发生时的鼠标位置.事件按键等. 事件对象 ...

  9. JavaScript:事件对象Event和冒泡

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章 DOM操作详解 中已经讲过事件的概 ...

最新文章

  1. ppi 各代iphone_算算你的手机 高PPI屏幕显示强机推荐
  2. docker 不包含依赖 打包_从零开始学K8s: 4.Docker是什么
  3. 【整理】SAP货币汇率转换
  4. 转:使用 Tkprof 分析 ORACLE 跟踪文件
  5. 搜索引擎优化系统知名乐云seo_seo技术出名 乐云seo:如何进行搜索引擎优化?
  6. php 两个数组 交集_两个数组的交集
  7. bzoj1562 [NOI2009]变换序列
  8. 深入分析八种前景看好的物联网业务形态
  9. 【人工智能】利用C语言实现KNN算法进行手写数字识别
  10. boost::factory实现对象工厂设计模式
  11. for in for of区别_这个句型中用介词for还是of?来看看解题技巧
  12. Prototype(原型模式)
  13. Linux命令篇之tree命令和touch命令
  14. Ubuntu软件中心的完全启用
  15. 百度网盘视频加速播放
  16. SSD(Single Shot MultiBox Detector)原理详解
  17. ARM板更改系统时期和时间
  18. 计算机输入法切换用户,输入法切换不出来电脑输入法不见了的最佳解决方案
  19. c语音,求两个数中的最大值
  20. 【服务器数据恢复】多块磁盘离线导致RAIDZ崩溃的数据恢复案例

热门文章

  1. html怎么替换列表的序号,查找并替换为html样式的项目符号列表
  2. 简单介绍一下SDP规范
  3. HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank‘ validat
  4. Oracle数据库——序列的创建
  5. 系统日志监控(PLG)
  6. eop如何烧写程序文件到开发板?
  7. Xplanner0.7安装
  8. 2008提权之突破系统权限安装shift后门
  9. 2023中国AIGC应用研究报告 | 附120页报告下载
  10. 封装、抽象、继承、多态