JS事件挂接(详细)
- 格式:doc
- 大小:48.50 KB
- 文档页数:3
事件的概念事件:指的是文档或者浏览器窗口中发生的一些特定交互瞬间。
我们可以通过侦听器(或者处理程序)来预定事件,以便事件发生的时候执行相应的代码。
一、事件流1.事件流:描述的是在页面中接受事件的顺序2.事件冒泡:由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点(文档)3.事件捕获:最不具体的节点先接收事件,而最具体的节点应该最后接收事件二、事件处理1.HTML事件处理:直接添加到HTML结构中2.DOM0级事件处理:把一个函数赋值给一个事件处理程序属性3.DOM2级事件处理:addEventListener("事件名","事件处理函数",布尔值)true:事件捕获false:事件冒泡removeEventListener();4.IE事件处理程序attachEventdetachEvent<!DOCTYPE html><html><head><meta charset="UTF-8"><title></title></head><body><div id="div"><button id="btn1">按钮</button></div><!--<script>function demo(){alert("Hello HTML事件处理");}</script>--><!--<script>var btn1 = document.getElementById("btn1");btn1.onclick = function(){alert("Hello DOM0级事件处理程序")};//被覆盖掉btn1.onclick = function(){alert("Hello DOM0级事件处理程序2")};btn1.onclick = function(){alert("Hello DOM0级事件处理程序3")};</script>--><!--<script>var btn1 = document.getElementById("btn1");btn1.addEventListener("click",demo1);btn1.addEventListener("click",demo2);btn1.addEventListener("click",demo3);function demo1(){alert("DOM2级事件处理程序1");}function demo2(){alert("DOM2级事件处理程序2");}function demo3(){alert("DOM2级事件处理程序3");}btn1.removeEventListener("click",demo2)</script>--><script>var btn1 = document.getElementById("btn1");if(btn1.addEventListener){btn1.addEventListener("click",demo);}else if(btn1.attachEvent){btn1.attachEvent("onclick",demo)}else{btn1.onclick = demo();}function demo(){alert("Hello");}</script></body></html>三、事件对象1、事件对象:在触发DOM事件的时候都会产生一个对象2、事件对象event:type:获取事件类型target:获取事件目标stopPropagation():阻止事件冒泡preventDefault():阻止事件默认行为<!DOCTYPE html><html><head><meta charset="UTF-8"><title></title></head><body><div id="div"><button id="btn1">按钮</button><a href="" id="aid">百度</a></div><script>document.getElementById("btn1").addEventListener("click",showType); document.getElementById("div").addEventListener("click",showDiv); document.getElementById("aid").addEventListener("click",showA); function showType(event){// alert(event.type);alert(event.target);event.stopPropagation();//阻止事件冒泡}function showDiv(){alert("div")}function showA(event){// event.stopPropagation();// event.preventDefault();}</script></body></html>。
js动态添加事件的方法在JavaScript中,有多种方法可以动态添加事件。
下面将介绍一些常用的方法:1. 使用addEventListener(方法:addEventListener(方法是DOM中最常用的方法之一,它可以在指定的元素上添加事件监听器。
此方法可以接收三个参数:事件类型、回调函数和一个布尔值(可选参数,用于指定事件是在捕获阶段还是冒泡阶段触发,默认为false表示冒泡阶段)。
```javascriptvar element = document.getElementById("myButton");element.addEventListener("click", functionconsole.log("Button clicked!");});```2.直接赋值事件处理程序:可以直接将事件处理程序赋值给元素的属性。
这种方法比较简单,适用于简单的事件处理。
```javascriptvar element = document.getElementById("myButton");element.onclick = functionconsole.log("Button clicked!");};```3. 使用onclick属性:可以使用元素的onclick属性来动态添加事件处理程序。
这种方法只能添加一个事件处理程序,并且会覆盖之前的处理程序。
```javascriptvar element = document.getElementById("myButton");element.onclick = functionconsole.log("Button clicked!");};```4.使用匿名函数:可以使用匿名函数来动态添加事件处理程序。
Javascript添加事件的addEventListener()及attachEvent。
Mozilla中:addEventListener的使⽤⽅式:target.addEventListener(type, listener, useCapture);target:⽂档节点、document、window 或 XMLHttpRequest。
type:字符串,事件名称,不含“on”,⽐如“click”、“mouseover”、“keydown”等。
listener :实现了 EventListener 接⼝或者是 JavaScript 中的函数。
useCapture :是否使⽤捕捉,⼀般⽤ false 。
例如:document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);IE中:target.attachEvent(type, listener);target:⽂档节点、document、window 或 XMLHttpRequest。
type:字符串,事件名称,含“on”,⽐如“onclick”、“onmouseover”、“onkeydown”等。
listener :实现了 EventListener 接⼝或者是 JavaScript 中的函数。
例如:document.getElementById("txt").attachEvent("onclick",function(event) {alert(event.keyCode);});W3C 及 IE 同时⽀持移除指定的事件, ⽤途是移除设定的事件, 格式分别如下:W3C格式:removeEventListener(event,function,capture/bubble);Windows IE的格式如下:detachEvent(event,function);target.addEventListener(type, listener, useCapture);target ⽂档节点、document、window 或 XMLHttpRequest。
js事件委托的语法JavaScript事件委托是一种常用的编程技巧,它允许我们通过将事件处理程序绑定到父元素上来管理子元素的事件。
这种编码方式在开发过程中非常有用,因为它不仅可以提高程序的性能,还能简化代码逻辑并改善代码的维护性。
事件委托的语法非常简单。
我们需要先选择一个合适的父元素作为事件触发的代理,并给它绑定相应类型的事件监听器。
例如,我们可以选择文档的body元素作为父元素,然后给它绑定click事件的监听器。
```javascriptdocument.body.addEventListener('click', function(event) { // 在这里处理事件逻辑});```在事件处理函数中,我们需要判断事件触发的具体元素是哪个子元素,并根据需要执行相应的操作。
这可以通过JavaScript中的事件对象(event)来实现。
事件对象包含了事件的相关信息,比如事件类型、触发的元素等。
为了判断事件是由哪个子元素触发的,我们可以通过事件对象的target属性进行判断。
target属性指向了实际触发事件的元素。
通过判断target元素的一些特定属性或者通过类名、标签名等来进行更具体的判断。
使用事件委托可以减少重复的事件绑定操作,尤其在涉及动态添加或删除子元素的情况下非常有用。
比如,当我们需要监听动态加载的列表项的点击事件时,如果使用事件委托,只需要给父元素绑定监听器一次即可,而不需要为每个列表项都重复绑定。
此外,事件委托还能提高程序的性能。
因为它利用了事件冒泡机制,事件在DOM树上冒泡,当事件到达父元素时触发监听器。
这意味着事件的冒泡只需要经过少量节点而不是每个子元素都会触发一次监听器。
这就大大减少了事件处理函数的数量,从而提高了页面的性能。
在开发过程中,我们还可以运用事件委托来实现更多的功能。
比如,我们可以通过事件委托来批量处理子元素的某些公共操作,或者实现一些高级功能,比如事件代理、事件过滤等。
JS如何为一个元素怎么绑定多个事件addEventListener是一个DOM方法,它接受三个参数:事件类型,事件处理函数和一个可选的布尔值。
以下是如何使用addEventListener 方法为元素绑定多个事件的示例:```javascript//获取元素var element = document.getElementById('myElement');//绑定多个事件element.addEventListener('click', functioconsole.log('点击事件');});element.addEventListener('mouseover', functioconsole.log('鼠标悬停事件');});element.addEventListener('mouseout', functioconsole.log('鼠标离开事件');});```在上面的代码中,我们首先使用getElementById方法获取一个具有id为"myElement"的元素。
然后,我们使用addEventListener方法为该元素绑定了三个事件:click,mouseover和mouseout。
每个事件都有一个相应的事件处理函数。
在这个例子中,当单击元素时,控制台将会输出"点击事件",当鼠标悬停在元素上时,控制台输出"鼠标悬停事件",当鼠标离开元素时,控制台输出"鼠标离开事件"。
通过使用addEventListener方法,您可以为一个元素绑定任意数量的事件。
这对于需要处理多个事件的交互和动态网页非常有用。
如果您需要为同一个元素绑定多个同类型的事件处理函数,您可以多次调用addEventListener方法并传递相同的事件类型。
js中的事件委托(事件代理)详解本⽂转载:js中的事件冒泡、事件委托是js 中⼀些需要注意的⼩知识点,这⾥结合转载⽂章总结⼀下:事件冒泡:JS中当出发某些具有冒泡性质的事件是,⾸先在触发元素寻找是否有相应的注册事件,如果没有再继续向上级⽗元素寻找是否有相应的注册事件作出相应,这就是事件冒泡。
事件委托:利⽤事件冒泡的特性,将本应该注册在⼦元素上的处理事件注册在⽗元素上,这样点击⼦元素时发现其本⾝没有相应事件就到⽗元素上寻找作出相应。
这样做的优势有:1.减少DOM操作,提⾼性能。
2.随时可以添加⼦元素,添加的⼦元素会⾃动有相应的处理事件。
转载⽂章内容:起因:1、这是前端⾯试的经典题型,要去找⼯作的⼩伙伴看看还是有帮助的;2、其实我⼀直都没弄明⽩,写这个⼀是为了备忘,⼆是给其他的知其然不知其所以然的⼩伙伴们以参考;概述:那什么叫事件委托呢?它还有⼀个名字叫事件代理,JavaScript⾼级程序设计上讲:事件委托就是利⽤事件冒泡,只指定⼀个事件处理程序,就可以管理某⼀类型的所有事件。
那这是什么意思呢?⽹上的各位⼤⽜们讲事件委托基本上都⽤了同⼀个例⼦,就是取快递来解释这个现象,我仔细揣摩了⼀下,这个例⼦还真是恰当,我就不去想别的例⼦来解释了,借花献佛,我摘过来,⼤家认真领会⼀下事件委托到底是⼀个什么原理:有三个同事预计会在周⼀收到快递。
为签收快递,有两种办法:⼀是三个⼈在公司门⼝等快递;⼆是委托给前台MM代为签收。
现实当中,我们⼤都采⽤委托的⽅案(公司也不会容忍那么多员⼯站在门⼝就为了等快递)。
前台MM收到快递后,她会判断收件⼈是谁,然后按照收件⼈的要求签收,甚⾄代为付款。
这种⽅案还有⼀个优势,那就是即使公司⾥来了新员⼯(不管多少),前台MM也会在收到寄给新员⼯的快递后核实并代为签收。
这⾥其实还有2层意思的:第⼀,现在委托前台的同事是可以代为签收的,即程序中的现有的dom节点是有事件的;第⼆,新员⼯也是可以被前台MM代为签收的,即程序中新添加的dom节点也是有事件的。
关于js的addEventListener和⼀些常⽤事件element.addEventListener(<event-name>, <callback>, <use-capture>);document.addEventListener("touchstart", function(){}, true)el.addEventListener('click',function(){},false);addEventListener⾥最后⼀个参数决定该事件的响应顺序;如果为true事件执⾏顺序为 addEventListener ---- 标签的onclick事件 ---- document.onclick 如果为false事件的顺序为标签的onclick事件 ---- document.onclick ---- addEventListener分别解释:event-name(string)这是你想监听的事件的名称或类型。
它可以是任何的标准DOM事件(click, mousedown, touchstart, transitionEnd,等等),当然也可以是你⾃⼰定义的事件名称callback(function)(回调函数)这个函数会在事件触发的时候被调⽤。
相应的事件(event)对象,以及事件的数据,会被作为第⼀个参数传⼊这个函数use-capture(boolean)这个参数决定了回调函数(callback)是否在“捕获(capture)”阶段被触发var element = document.getElementById('element');function callback() {alert('Hello');}// Add listenerelement.addEventListener('click', callback);移除事件监听element.removeEventListener(<event-name>, <callback>, <use-capture>);注意:移除时必须要有这个被绑定的回调函数的引⽤。
js事件捕获,事件冒泡,事件委托以及DOM事件流⼀:DOM事件流:事件流是从页⾯接收事件的顺序,DOM2级事件规定事件流包括三个阶段:①事件捕获阶段:⽤意在于事件达到⽬标之前捕获它,在事件捕获阶段事件流模型:document→html→body→div②处于⽬标阶段2:实际的⽬标到事件③事件冒泡阶段:由最具体的元素接收到事件,然后向上传播到较为不具体的节点。
事件流模型:div →body→ html→ document⼆:事件委托事件委托顾名思义:将事件委托给另外的元素。
其实就是利⽤DOM的事件冒泡原理,将事件绑定到⽬标元素的⽗节点。
如果要为⼤量的元素节点绑定事件,完美可以⽤事件委托完美解决,直接将事件绑定在这些元素的⽗节点上,只需要绑定⼀次,就可以在所有⼦节点触发事件。
三:常见的事件绑定:(1)bind()缺点:只能给调⽤它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件,⽐如内容很多的时候,⽹页中很多内容需要点击“下⼀页”的时候才会被加载,则这时新加载出的元素bind则没有给他们绑定事件。
bind()不能使⽤的情况:①为DOM中的很多元素绑定相同事件;②为DOM中尚不存在的元素绑定事件;解决⽅法:使⽤live()⽅法(2)live()⽅法会把click事件绑定到$(document)对象,⽽且只需要给$(document)绑定⼀次(不是50次,更不是5000次),然后就能够处理后续动态加载的节点的事件。
在接收到任何事件时,$(document)对象都会检查事件类型和事件⽬标,如果是click事件且事件⽬标是td,那么就执⾏委托给它的处理程序。
缺点:①$()函数会找到当前页⾯中的所有⽬标元素并创建jQuery对象,但在确认事件⽬标时却不⽤这个集合,⽽是使⽤选择符表达式与event.target 或其祖先元素进⾏⽐较,因⽽⽣成这个jQuery对象会造成不必要的开销;②默认把事件绑定到$(document)元素,如果DOM嵌套结构很深,事件冒泡通过⼤量祖先元素会导致性能损失;③只能放在直接选择的元素后⾯,不能在连缀的DOM遍历⽅法后⾯使⽤,即$("#info_table td").live...可以,但$("#info_table").find("td").live...不⾏;④收集⽬标元素并创建jQuery对象,但实际操作的却是$(document)对象,令⼈费解。
JavaScript事件处理常见问题解决知识点JavaScript是一种广泛应用于Web开发的脚本语言,而事件处理是JavaScript中非常重要的一部分。
在使用JavaScript处理事件的过程中,我们可能会遇到一些常见的问题。
本文将介绍这些问题并提供解决知识点。
一、事件绑定问题1. 问题描述:如何将事件绑定到HTML元素上?解决知识点:可以使用addEventListener方法进行事件的绑定。
该方法接受三个参数:要绑定事件的元素、要绑定的事件类型和事件处理函数。
示例代码:```javascriptconst element = document.getElementById("myElement");element.addEventListener("click", function() {// 事件处理代码});```2. 问题描述:如何移除已绑定的事件?解决知识点:可以使用removeEventListener方法来移除已绑定的事件。
该方法的参数与addEventListener方法相同。
示例代码:```javascriptconst element = document.getElementById("myElement");const handleClick = function() {// 事件处理代码};element.addEventListener("click", handleClick);// 移除事件处理函数element.removeEventListener("click", handleClick);```二、事件对象问题1. 问题描述:如何获取触发事件的目标元素?解决知识点:事件处理函数的第一个参数即为事件对象,可以通过该对象的target属性获取触发事件的目标元素。
js事件传播机制在JavaScript 中,事件传播机制是指当一个事件发生在DOM 元素上时,该事件是如何在DOM 树中传播的。
事件传播机制分为三个阶段:捕获阶段、目标阶段和冒泡阶段。
1. 捕获阶段(Capture Phase):事件从最外层的祖先元素向下传播到目标元素的过程。
在这个阶段,事件从document 对象一直传播到目标元素。
如果给目标元素的祖先元素绑定了事件处理程序,并且设置了捕获阶段的事件监听器,那么这些事件监听器会在捕获阶段被触发。
2. 目标阶段(Target Phase):事件到达目标元素,触发在目标元素上绑定的事件处理程序。
3. 冒泡阶段(Bubble Phase):事件从目标元素开始向上传播到祖先元素的过程。
如果目标元素上的事件处理程序已经执行完毕,且祖先元素上也有相同类型的事件处理程序,那么这些事件处理程序会在冒泡阶段被触发。
在事件传播的过程中,可以使用`event.stopPropagation()` 方法来阻止事件的继续传播,或者使用`event.preventDefault()` 方法来阻止事件的默认行为。
在JavaScript 中,可以使用以下方法来添加事件监听器:- `addEventListener(event, function, useCapture)`:用于在指定元素上添加事件监听器,第三个参数用于指定是否使用捕获阶段。
- `removeEventListener(event, function, useCapture)`:用于移除事件监听器。
理解事件传播机制对于编写复杂的交互式JavaScript 应用程序非常重要,因为它可以帮助我们更好地控制事件的处理流程。
通过原⽣js对DOM事件的绑定的⼏种⽅式总汇在⽹页开发中经常会有交互操作,⽐如点击⼀个dom元素,需要让js对该操作做出相应的响应,这就需要对Dom元素进⾏事件绑定来进⾏处理,js通常有三种常⽤的⽅法进⾏事件绑定:在DOM元素中直接绑定;在JavaScript代码中绑定;绑定事件监听函数。
直接在DOM元素绑定事件1 <div id="btn" onclick="clickone()"></div> //直接在DOM⾥绑定事件2 <script>3 function clickone(){ alert("hello"); }4 </script>在JavaScript代码中绑定1 <div id="btn"></div>2 <script>3 document.getElementById("btn").onclick = function(){ alert("hello"); } //脚本⾥⾯绑定4 </script>绑定事件监听函数<div id="btn"></div><script> document.getElementById("btn").addeventlistener("click",clickone,false); //通过侦听事件处理相应的函数,//第三个参数设置为true就在捕获过程中执⾏,反之就在冒泡过程中执⾏处理函数。
function clickone(){ alert("hello"); }</script>IE下使⽤attachEvent/detachEvent:addEventListener 只⽀持到 IE 9,所以为了兼容性考虑,在兼容 IE 8 以及以下浏览器可以⽤attachEvent 函数,和 addEventListener 函数表现⼀样,除了它绑定函数的 this 会指向全局这个缺点以外,使⽤为了考虑兼容性,我们在使⽤前,可以添加下⾯这段代码(下⾯使⽤采⽤惰性加载的⽅法):var addListener = null,removeListener = null;if (typeof window.addEventListener === 'function') {addListener = function(el, type, fn) {el.addEventListener(type, fn, false);};removeListener = function(el, type, fn) {el.removeEventListener(type, fn, false);};} else if (typeof doc.attachEvent === 'function') { //'IE'addListener = function(el, type, fn) {el.attachEvent('on'+type, fn);};removeListener = function(el, type, fn) {el.detachEvent('on'+type, fn);};} else {addListener = function(el, type, fn) {el['on'+type] = fn;};removeListener = function(el, type, fn) {el['on'+type] = null;};}最后,进⾏事件绑定时可以这么写:addListener(dom, "click", EventHandler.confirmBtnClickEvent);var EventHandler = {confirmBtnClickEvent: function(e){}//其他事件的回调函数...};区别说明:⽅式1和⽅式2是我们经常⽤到的,那么既然已经有两种绑定事件的⽅法为什么还要有第三种呢?答案是这样的:⽤ "addeventlistener" 可以绑定多次同⼀个事件,且都会执⾏,⽽在DOM结构如果绑定两个 "onclick" 事件,只会执⾏第⼀个;在脚本通过匿名函数的⽅式绑定的只会执⾏最后⼀个事件。
JSaddEventListener()和attachEvent()⽅法实现注册事件在 JavaScript 的 DOM 事件模型中,通过调⽤对象的 addEventListener() ⽅法注册事件。
⽤法如下:element.addEventListener(String type, Function listener, boolean useCaptrue);参数说明如下:type:注册事件的类型名。
事件类型与事件属性不同,事件类型名没有 on 前缀。
例如,对于事件属性 onclick 来说,所对应的事件类型为 click。
listener:监听函数,即事件处理函数。
在指定类型的事件发⽣时将调⽤该函数。
在调⽤这个函数时,默认传递给它的唯⼀参数是 event 对象。
useCaptrue:是⼀个布尔值。
如果为 true,则指定的事件处理函数将在事件传播的捕获阶段触发;如果为 false,则事件处理函数将在冒泡阶段触发。
⽰例1下⾯⽰例使⽤ addEventListener() 为所有按钮注册 click 事件。
⾸先,调⽤ document 的 getElementsByTagName() ⽅法捕获所有按钮对象;然后,使⽤ for 语句遍历按钮集(btn),并使⽤ addEventListener() ⽅法分别为每⼀个按钮注册事件函数,获取当前对象所显⽰的⽂本。
<button id="btn1" onclick="btn1();">按钮 1</button><button id="btn2" onclick="btn2(event);">按钮 2</button><script>var btn = document.getElementsByTagName("button"); //捕获所有按钮for(var i in btn){ //遍历按钮集合btn[i].addEventListener("click", function(){alert(this.innerHTML);}, true); //为每个按钮对象注册⼀个事件处理函数,定义在捕获阶段进⾏响应}</script>在浏览器中预览,单击不同的按钮,则浏览器会⾃动显⽰按钮的名称。
JavaScript事件处理详解一、引言JavaScript是一种广泛应用于网页开发的脚本语言,它能够为页面增加交互性和动态效果。
而事件处理是JavaScript中重要的一部分,它能够对用户的操作做出响应,实现与用户的互动。
本文将详细介绍JavaScript事件处理的相关知识。
二、事件概述在JavaScript中,事件是指用户或浏览器操作所触发的某个行为或状态的改变。
这些事件包括鼠标点击、键盘输入、窗口加载等。
JavaScript通过事件处理函数对这些事件做出响应。
三、事件处理的方式1. 在HTML中直接绑定事件处理函数:可以将事件处理函数直接写在HTML元素的属性中,例如onclick、onkeydown等。
这种方式简单直接,但不易维护,且只能绑定一个事件处理函数。
2. 使用DOM属性绑定事件处理函数:可以通过DOM的属性来绑定事件处理函数,例如element.onclick = function() {}。
这种方式与第一种方式类似,但可以绑定多个事件处理函数。
3. 使用addEventListener方法绑定事件处理函数:可以使用addEventListener方法来绑定事件处理函数,例如element.addEventListener('click', function() {})。
这种方式是推荐使用的,可以绑定多个事件处理函数,并具有更好的兼容性。
四、事件冒泡和事件捕获在DOM中,事件存在冒泡和捕获两个阶段。
1. 事件冒泡:事件冒泡是从内到外的过程,即事件首先被触发在最具体的元素上,然后逐渐向上冒泡到更一般的元素。
2. 事件捕获:事件捕获正好与事件冒泡相反,它是从外到内的过程,即事件首先被触发在最不具体的元素上,然后逐渐向下捕获到更具体的元素。
在addEventListener方法中,可以通过第三个参数来指定事件是在冒泡阶段还是捕获阶段进行处理。
五、事件对象在事件处理函数中,可以通过事件对象来获取触发事件的相关信息。
js load事件用法(实用版)目录1.JS 加载事件的概念2.JS 加载事件的种类3.JS 加载事件的用法示例4.JS 加载事件的优缺点正文一、JS 加载事件的概念JS 加载事件,指的是在网页中,当 JavaScript 文件被加载、解析或执行过程中触发的一系列事件。
这些事件可以帮助开发者更精确地控制代码的执行时机,从而提高网页性能和交互体验。
二、JS 加载事件的种类1.onload 事件:当页面或图像加载完成时触发。
2.onerror 事件:当页面或图像加载失败时触发。
3.onreadystatechange 事件:当页面或图像的读取状态发生变化时触发,例如:正在加载、加载完成、加载失败等。
4.onabort 事件:当页面或图像的加载过程被中止时触发。
5.onresume 事件:当页面或图像的加载过程被恢复时触发。
三、JS 加载事件的用法示例以 onload 事件为例,以下是一个简单的示例:```javascript<!DOCTYPE html><html><head><meta charset="UTF-8"><title>JS 加载事件示例</title><script>function onLoad() {alert("页面加载完成");}</script></head><body onload="onLoad()"><h1>欢迎来到 JS 加载事件示例页面</h1></body></html>```在这个示例中,当页面加载完成时,会弹出一个警告框显示“页面加载完成”。
四、JS 加载事件的优缺点优点:1.可以帮助开发者更精确地控制代码的执行时机,提高网页性能。
2.可以实现更加丰富的交互效果,提升用户体验。
javascript如何添加事件和删除事件js添加移除事件的⽅法:1、使⽤addEventListener()⽅法添加事件,⽤于向指定元素添加事件句柄;2、使⽤removeEventListener()⽅法删除事件,⽤于移除由addEventListener()⽅法添加的事件句柄。
本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。
⼀、addEventListener()和removeEventListener()讲解addEventListener()与removeEventListener()⽤于处理指定和删除事件处理程序操作。
它们都接受3个参数:如 addEventListener("事件名" , "事件处理函数" , "布尔值"); (注:事件名不含"on",如“click”)现在的版本可以省略第三个参数,默认值为false⽰例:要在body上添加事件处理程序,可以使⽤下列代码:1 document.body.addEventListener('touchmove', function (event) {23 event.preventDefault();45 },false);通过addEventListener()添加的事件处理程序只能使⽤removeEventListener()来移除;移除时传⼊的参数与添加处理程序时使⽤的参数相同。
这也意味着通过addEventListener()添加的匿名函数⽆法移除错误⽤法⽰例:1 document.body.addEventListener('touchmove', function (event) {23 event.preventDefault();45 },false);67 document.body.removeEventListener('touchmove', function (event) {89 event.preventDefault();1011 },false);这个例⼦中,使⽤addEventListener()添加⼀个事件处理程序。
js事件处理机制JavaScript是一种流行的编程语言,广泛运用于现代Web应用程序中。
事件处理机制是JavaScript中一个重要的方面,可以使你的应用程序对用户的交互做出动态响应。
本文将介绍JavaScript事件处理机制,包括事件类型、事件处理程序、事件冒泡和捕获以及事件代理。
1. 事件类型JavaScript可以处理各种类型的事件,包括鼠标操作、键盘操作、窗口操作等,还可以自定义事件。
其中,鼠标事件包括click、dblclick、mousedown、mouseup等;键盘事件包括keydown、keyup、keypress等;窗口事件包括load、unload、resize、scroll等。
2. 事件处理程序当事件发生时,浏览器会自动寻找相应的事件处理程序来执行。
可以通过以下方法指定事件处理程序:(1)HTML事件处理程序:在HTML元素中添加事件属性,如onclick、onload等。
(2)DOM0级事件处理程序:通过JavaScript代码指定事件处理程序,如element.onclick=function(){}。
(3)DOM2级事件处理程序:通过addEventListener方法指定事件处理程序,如element.addEventListener('click', function(){}, false)。
3. 事件冒泡和捕获当一个事件被触发时,它会从事件目标(通常是页面中的元素)开始,沿着DOM树向上传播,可以称之为事件冒泡。
而事件捕获则是从根节点到事件目标的过程。
DOM2级事件定义了两种处理事件的方式:事件冒泡和事件捕获。
默认情况下,事件处理程序会在事件冒泡阶段被触发,但可以通过设置addEventListener方法的第三个参数为true,将事件处理程序绑定在事件捕获阶段。
4. 事件代理事件代理是一种技术,可以减少事件处理程序的数量,提高性能。
通过将事件处理程序绑定在父元素上,可以代理子元素的事件。
详解js的事件代理(委托)JavaScript事件代理(委托)⼀般⽤于以下情况:1. 事件注册在祖先级元素上,代理其⼦级元素。
可以减少事件注册数量,节约内存开销,提⾼性能。
2. 对js动态添加的⼦元素可⾃动绑定事件。
之前⼀直⽤各种js库的事件代理,如 jQuery,⾮常⽅便实⽤。
今天尝试⽤原⽣ js 实现该功能。
var addEvent = (function () {if (document.addEventListener) {return function (element, type, handler) {element.addEventListener(type, handler, false);};} else if (document.attachEvent) {return function (element, type, handler) {element.attachEvent('on' + type, function () {handler.apply(element, arguments);});};} else {return function (element, type, handler) {element['on' + type] = function () {return handler.apply(element, arguments);};};}})(),getClassElements = function (parentElement, classname) {var all, element, classArr = [], classElements = [];if (parentElement.getElementsByClassName) {return parentElement.getElementsByClassName(classname);} else {all = parentElement.getElementsByTagName('*');for (var i = 0, len = all.length; i < len; i++) {element = all[i];classArr = element && element.className && element.className.split(' ');if (classArr) {for (var j = 0; j < classArr.length; j++) {if (classArr[j] === classname) {classElements.push(element);}}}}return classElements;}},delegate = function () { // 参数:element, type, [selector,] handlervar args = arguments,element = args[0],type = args[1],handler;if (args.length === 3) {handler = args[2];return addEvent(element, type, handler);}if (args.length === 4) {selector = args[2];handler = args[3];return addEvent(element, type, function (event) {var event = event || window.event,target = event.target || event.srcElement,quickExpr = /^(?:[a-zA-Z]*#([\w-]+)|(\w+)|[a-zA-Z]*\.([\w-]+))$/,match,idElement,elements,tagName,count = 0,len;if (typeof selector === 'string') {match = quickExpr.exec(selector);if (match) {// #ID selectorif (match[1]) {idElement = document.getElementById(match[1]);tagName = match[0].slice(0, match[0].indexOf('#'));// tag selector} else if (match[2]) {elements = element.getElementsByTagName(selector);// .class selector} else if (match[3]) {elements = getClassElements(element, match[3]);tagName = match[0].slice(0, match[0].indexOf('.'));}}if (idElement) {if ( tagName ? tagName === idElement.nodeName.toLowerCase() && target === idElement : target === idElement ) {return handler.apply(idElement, arguments);}} else if (elements) {for (len = elements.length; count < len; count++) {if ( tagName ? tagName === elements[count].nodeName.toLowerCase() && target === elements[count] : target === elements[count] ) { return handler.apply(elements[count], arguments);}}}}});}};主要是⽤ apply 改变 this 的指向handler.apply(idElement, arguments);handler.apply(elements[count], arguments);测试⼀下:<style>#outer {padding: 50px; background-color: lightpink;}#inner {padding: 30px; background-color: aliceblue;}#paragraph1, #paragraph3 {background-color: cadetblue}</style><div id="outer">outer<div id="inner">inner<p id="paragraph1" class="parag1">paragraph1</p><p id="paragraph2" class="parag">paragraph2</p><span>span</span><p id="paragraph3" class="parag">paragraph3</p></div></div>var outer = document.getElementById('outer');delegate(outer, 'click', function () {console.log(this.id); // outer});delegate(outer, 'click', 'p', function () {console.log(this.id); //点击 paragraph1 元素,输出其id为 "paragraph1"});模仿 jQuery 的风格,优化代码:(function () {var $ = function (element) {return new _$(element);};var _$ = function (element) {this.element = element && element.nodeType === 1 ? element : document;};_$.prototype = {constructor: _$,addEvent: function (type, handler, useCapture) {var element = this.element;if (document.addEventListener) {element.addEventListener(type, handler, (useCapture ? useCapture : false));} else if (document.attachEvent) {element.attachEvent('on' + type, function () {handler.apply(element, arguments);});} else {element['on' + type] = function () {return handler.apply(element, arguments);};}return this;},getClassElements: function (classname) {var element = this.element, all, ele, classArr = [], classElements = [];if (element.getElementsByClassName) {return element.getElementsByClassName(classname);} else {all = element.getElementsByTagName('*');for (var i = 0, len = all.length; i < len; i++) {ele = all[i];classArr = ele && ele.className && ele.className.split(' ');if (classArr) {for (var j = 0; j < classArr.length; j++) {if (classArr[j] === classname) {classElements.push(ele);}}}}return classElements;}},delegate: function () { //参数:type, [selector,] handlervar self = this,element = this.element,type = arguments[0],handler;if (arguments.length === 2) {handler = arguments[1];return self.addEvent(type, handler);} else if (arguments.length === 3) {selector = arguments[1];handler = arguments[2];return self.addEvent(type, function (event) {var event = event || window.event,target = event.target || event.srcElement,quickExpr = /^(?:[a-zA-Z]*#([\w-]+)|(\w+)|[a-zA-Z]*\.([\w-]+))$/,match,idElement,elements,tagName,count = 0,len;if (typeof selector === 'string') {match = quickExpr.exec(selector);if (match) {// #ID selectorif (match[1]) {idElement = document.getElementById(match[1]);tagName = match[0].slice(0, match[0].indexOf('#'));// tag selector} else if (match[2]) {elements = element.getElementsByTagName(selector);// .class selector} else if (match[3]) {elements = self.getClassElements(match[3]);tagName = match[0].slice(0, match[0].indexOf('.'));}}if (idElement) {if ( tagName ? tagName === idElement.nodeName.toLowerCase() && target === idElement ? target === idElement ) {return handler.apply(idElement, arguments);}} else if (elements) {for (len = elements.length; count < len; count++) {if ( tagName ? tagName === elements[count].nodeName.toLowerCase() && target === elements[count] : target === elements[count] ) { return handler.apply(elements[count], arguments);}}}}});}}};window.$ = $;return $;}());使⽤如下:var outer = document.getElementById('outer');$(outer).delegate('click', '.parag', function (event) {console.log(this.id);});以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,同时也希望多多⽀持!。
最近学习了JS挂接事件,根据自己对JS挂接事件的了解,以及自己的实际操作。对相
关知识进行了如下总结,希望可以帮到大家。
1、事件挂接的第一种方式:
例://不传递参数
function testBtn1(){
alert(1);
alert(this);//this指的是window
}
//传递参数
function testBtn1(num){
alert(num);//num=100
}
//同时挂接多个事件