百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

总结JavaScript事件机制

myzbx 2025-01-06 14:22 13 浏览

JavaScript事件模型

在各种浏览器中存在三种事件模型: 原始事件模型 , DOM2事件模型 , IE事件模型。

其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE以外的所有主流浏览器支持.

原始事件模型:

在原始事件模型中(也有说DOM0级),事件发生后没有传播的概念,没有事件流。事件发生,处理,结束,就这么简单。监听函数只是元素的一个属性值,通过指定元素的属性值来绑定监听器。书写方式有两种:

(1) HTML代码中指定属性值:<input type=”button” onclick=”func” />

(2) 在js代码中指定属性值:document.getElementsByTagName(‘input’)[0].onclick = func

优点:所有浏览器都兼容

缺点:

1.逻辑与显示没有分离

2.相同事件的监听函数只能绑定一个,后绑定的会覆盖掉前面的

3.无法通过事件的冒泡、委托等机制。

DOM2事件模型

此模型是W3C制定的标准模型。W3C制定的事件模型中,一次事件的发生包含三个过程:

(1)事件捕获阶段。事件被从document一直向下传播到目标元素,在这过程中依次检查经过的节点是否注册了该事件的监听函数,若有则执行。

(2)事件处理阶段。事件到达目标元素,执行目标元素的事件处理函数.

(3)事件冒泡阶段。事件从目标元素上升一直到达document,同样依次检查经过的节点是否注册了该事件的监听函数,有则执行。

所有的事件类型都会经历 "事件捕获阶段" 但是只有部分事件会经历 "事件冒泡阶段" 阶段,例如submit事件就不会被冒泡。

e.target与e.currentTarget是干什么的?

e.target获取当前实际触发事件节点,e.currentTarget获取获取当前监听节点。

<div>
     <span>11111</span>
</div>

$('div').on('click', function(e){
console.log(e.currentTarget);
console.log(e.target);
})

如果点击span的输出:

li对象

span对象

点击li的非span区域,输出

preventDefault与stopPropagation是干什么的

preventDefault取消事件默认动作,如下例,页面不会跳转

<a href='baidu.com' onclick="stop(e)">

//js:
function stop(e){
  e.preventDefault;
}

stopPropagation阻止元素冒泡,下例 点击child div,parent 的 alert 不会执行

<div id="parent" onclick="alert(this.id)" >

     <div id="child" onclick="doSomething;" ></div>

</div>

//js
function doSomething(e){
    e.stopPropagation
}

什么是dispatchEvent?

dispatchEvent是js的事件触发器,事件触发器就是用来触发某个元素下的某个事件。

可以自定义事件,通过触发器触发。

document.addEventListener('test', function(e){
    console.log(e.msg)
});
var e = document.createEvent('HTMLEvents');
e.initEvent('test', true, true);
e.msg = ' test dispatchEvent';
document.dispatchEvent(e);

//最终输出 test dispatchEvent

如何实现事件代理,封装一个方法:

首先介绍一下JavaScript的事件代理。事件代理在JS世界中一个非常有用也很有趣的功能。

当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数,

这主要得益于浏览器的事件冒泡机制。

以下封装一个简单的实现,只支持id绑定和节点选择

<ul id="list">
	<li>1</li>
	<li>2</li>
	<li>3</li>
	<div>div</div>
</ul>

<script>
function delegation(id, node, event, cb) {
	var el = document.getElementById(id);
	el.addEventListener(event, function(e){
		if(e.target.nodeName.toLocaleLowerCase == node.toLocaleLowerCase){
			cb && cb(e);
		}
	})
}

delegation('list', 'li', 'click', function(e){
    console.log(e.target.textContent);
})
</script>

事件代理的问题:

<li><span></span></li>如果同时给span与li绑定事件该如何阻止冒泡???

代码如下:事件代理同时绑定了li和span,当点击span的时候,li和span都会冒泡。

<li>
    <span></span>
</li>


$(document).on('click', 'li', function{
  alert('li click');
});

$(document).on('click', 'span', function{
  alert('li span');
})

获取当前事件的target目标元素,如果是span标签,就不执行li标签绑定事件的逻辑。

$(document).on('click', 'li', function(e){
  if(e.target.nodeName == 'SPAN') {
      e.stopPropagation;
      return;  
  }
  alert('li click');
});

tap事件是如何实现的

以下是zepto部分源码,tap是一个自定义事件,监听touchend,并且250ms之内没有触摸操作而被触发

 .on('touchend MSPointerUp pointerup', function(e){
       
 tapTimeout = setTimeout(function {

 // trigger universal 'tap' with the option to cancelTouch
 // (cancelTouch cancels processing of single vs double taps for faster 'tap' response)
 var event = $.Event('tap')
 event.cancelTouch = cancelAll
 // [by paper] fix -> "TypeError: 'undefined' is not an object (evaluating 'touch.el.trigger'), when double tap
 if (touch.el) touch.el.trigger(event)

 // trigger double tap immediately
 if (touch.isDoubleTap) {
 if (touch.el) touch.el.trigger('doubleTap')
 touch = {}
 }

 // trigger single tap after 250ms of inactivity
 else {
 touchTimeout = setTimeout(function{
 touchTimeout = null
 if (touch.el) touch.el.trigger('singleTap')
 touch = {}
 }, 250)
 }
 }, 0)
 } else {
 touch = {}
 }
 deltaX = deltaY = 0

      })

tap会产生什么问题

tap会出现目前所谓“点透”的情况,下图是的黑色透明遮罩绑定了tap,提交按钮绑定了click事件,如果在按钮的位置点击遮罩,会同时触发click和tap,

tap的延迟为250毫秒,而click事件的延迟是300毫秒。tap触发隐藏遮罩后,click刚好延迟结束,此时按钮就会被点击。

zepto的touch库做了什么

zepto touch库通过touchmove,touchstart和touchend,封装了自定义事件:触摸,双击,长按,滑动,方向滑动等。

fastclick解决了什么问题

fastclick解决了click事件延迟的问题,因为300毫秒的延迟会造成很多问题,在移动端会干扰touch事件。

fastclick核心代码:

FastClick.prototype.onTouchEnd = function(event){
  if (!this.needsClick(targetElement)) {
    // 则屏蔽原生事件,避免触发两次click
    event.preventDefault; 
    // 触发一次模拟的click
    this.sendClick(targetElement, event);
  }
}
FastClick.prototype.sendClick = function(targetElement, event) {

  // 创建一个鼠标事件
  clickEvent = document.createEvent('MouseEvents');
  // 初始化鼠标事件为click事件
  clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);

  // fastclick的内部变量,用来识别click事件是原生还是模拟
  clickEvent.forwardedTouchEvent = true;

  // 在目标元素上触发该鼠标事件,
  targetElement.dispatchEvent(clickEvent);

相关推荐

历数高通骁龙哪些处理器会继续风光或爆发于2015年

【处理器】高通骁龙810处理器规格谁是最快的手机处理器”目前尚存争议,但很快,这个问题将不会再有第二个答案,高通在Comput全新的旗舰产品骁龙810/808,我敢打赌,这绝对是有史以来性能最为强大的...

S6新赛季第一周数据一览:五大赛区风格大揭秘

【本文系友站星竞界LOL站独家稿件,未经授权严禁商业转载,否则将追究法律责任】(原文地址)一、BAN角排名这里统计的是各赛区的前十名BAN角,那我们可以从这其中总结出的信息有:①Ryze、GP、Lu...

到户外来场派对吧!Bose SoundLink Max手提音箱

近日,Bose经典的便携式蓝牙音箱SoundLink系列迎来新成员——BoseSoundLinkMax。正如名字中的“Max”一样,它应该是我体验过体积最大的SoundLink系列产品了。12cm...

第二周数据整理 揭秘五大赛区风格区别

一、BP率排名这里统计的是各赛区BP率占据前十的角色,从这其中我们可以了解到,统治赛场的到底是哪些角色:S-tier(S级):瑞兹、船长、Lulu、牛头,四大魔头稳定占据BP榜的前五名。A-tier(...

飞利浦全新5000系列电须刀评测,权威平台齐赞全能理容

“看脸时代”,男人的面子问题一路影响到竞争激烈的职场。需要清爽干练的形象助你获得宝贵职场优势?光剃须当然是不够的!全球男士理容领导品牌飞利浦,推出全新5000系列多功能电须刀,创新Turbo+劲能加速...

美国研发柔性屏幕手机,宣称让苹果、三星无还手之力

得力于三星的曲面屏让原来已经是红海的智能手机树立新的标杆。曲面屏,一方面被认为是提高手机舒适度、创新用户使用页面呈现等的“革命性”产品和技术。但是这些还不够,可是就在这几天,美国的手机制造商BLU在I...

ECC给i.MXRT1170 FlexRAM带来了哪些变化?

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAMECC功能。ECC是“ErrorCorrectingCode”...

三星Note 4电池续航测试 “爷爷辈”爱抢镜

【巴士数码】9月30日讯:近日韩国媒体PlayWare对三星GalaxyNote4的电池续航能力进行了一番检验。他们测试的是在韩国本土销售的Exynos版本,型号SM-N910,配备电池规格322...

【专题】总有一种适合你,16款家庭影院扬声器推荐(连载2)

前情回顾Bowers&Wilkins宝华韦健FormationUltimateMovieCollection/Panorama3如果你是90后年轻人,追求时尚,追求简洁,那么Bowers...

日产免提短信助手:食之无味,弃之可惜

开车时想发短信了怎么办?估计不少人都能想到语音命令。日产最近在它的NissanConnect上也更新了一个功能:免提短信助手。可以在开车的时候通过语音控制的方法来输入短信,在美国,这项功能前三年免费,...

多店铺运营必看!5个工具轻松规避平台风控

在跨境电商和无货源模式日益火热的今天,越来越多的卖家开始布局多店铺运营,以分散风险、提高收益。然而,多店铺运营最让人头疼的问题之一就是各大电商平台的风控。**如何合理规避风控,确保店铺长期稳定运营?*...

杭州骄傲!出生14个月查出脑瘫,17岁破了世界纪录,两枚金牌!妈妈的话令人瞬间破防

10月24日,杭州运动员诸吉在全国第十一届残疾人运动会暨第八届特殊奥林匹克运动会上,奋力拼搏,取得女子20分4*50米自由泳接力第一名,并超世界纪录;女子S5级200米自由泳第一名、50米自由泳第三名...

双轮电动车选什么品牌好?爱尔威S5

很多人都在跟小编抱怨说一款合心意的代步工具怎么就那么难找,其实,想拥有一款满意的代步产品很简单。今天小编就给各位推荐一款代步性能非常出色的代步工具,它就是爱尔威S5越野平衡车。爱尔威S5越野平衡车,全...

铁威马TRAID阵列管理工具,更高的磁盘空间利用率

数字化时代,数据量也在迅速的增长,NAS网络存储的出现,就很好的解决了数据存储刚需,利用NAS存储数据成为越来越多人的选择。但随着存储数据量的增长,在我们购入更大容量的硬盘时,也希望旧的硬盘也能继续发...

兼具两项稀有配置的松下S5M2X(松下s5 参数)

大家好,我是ET,欢迎来到相机笔记。在目前的全画幅微单相机中,松下S5M2X兼具两项“稀有配置”:其一,它与S5M2都内置了小型散热风扇,长时间录制视频/流媒体传输不过热。其二,它能将视频直接录制到移...