You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
target.addEventListener(type,listener,options);target.addEventListener(type,listener,useCapture);target.addEventListener(type,listener,useCapture,wantsUntrusted);// Gecko/Mozilla only
一、什么是事件
二、一些事件 Event reference
在Web中, 事件在浏览器窗口中被触发并且通常被绑定到窗口内部的特定部分 — 可能是一个元素、一系列元素、被加载到这个窗口的 HTML 代码或者是整个浏览器窗口。举几个可能发生的不同事件:
三、使用网页事件的方式
1.传统事件模型-DOM0 traditional model
移除事件:
不通过事件触发
问题
传统事件模型只能接受一个函数,如果注册多个事件,就会被后面的所覆盖
2.早期的事件回调(行内事件处理器-请勿使用)
3.addEventListener() 和 removeEventListener()-DOM2
W3C 和微软都各自开发了他们自己的一套事件模型用于替换 Netscape 的传统事件模型。
1).W3C(Document Object Model (DOM) Level 2 Events )
W3C 的 DOM2 事件模型提供了在同一元素上注册多个事件的方式。
注册多个:
移除事件:
匿名函数(Anonymous functions)
this
在 Javascript 中,this 始终指向函数的 “owner” ,在事件回调中可以方便的使用 this 去操作 HTML element。
是否注册了事件?
W3C 的事件模型有个问题就是不能知道元素是否已经注册了哪些事件。
在传统事件模型中,我们可以这么做:
被注册的函数会被显示,undefined 表示没有注册。在最新的 DOM Level 3 Events 中添加了eventListenerList 去存储注册事件,不过 api 太新,兼容性不够。
庆幸的是,removeEventListener() 不会报错,哪怕没有注册,所以可以放心使用。
2).Microsoft(不推荐)
DOM3级事件
DOM3级事件在DOM2级事件的基础上添加了更多的事件类型,全部类型如下:
同时DOM3级事件也允许使用者自定义一些事件
四、事件顺序(Event order)
假设以下场景:element1、element2 都有一个 onClick 事件,如果点击 element2,两个点击事件都会触发,但谁先触发就是下面要说的事件顺序
1.两个模型
1).事件捕获
element1 的事件先触发,element2 事件最后触发。
2).事件冒泡
element2 的事件先触发,element1 事件最后触发。
2.W3C 模型
W3C 整合后就是我们目前在使用的事件捕获、冒泡模型了。即任何事件都是先捕获直到抵达 target,然后再冒泡。
开发者可以自由选择是在捕获阶段还是冒泡阶段去注册事件。即通过 addEventListener() 函数的第三参数。如果是 true,则设定为捕获阶段,如果为 false,则设定为冒泡。
场景一:
如果点击 element2:
doSomething2()
事件,并执行。doSomething()
。场景二:
如果点击 element2:
doSomething()
。doSomething2
执行关闭
有时候希望停止冒泡或者捕获。
Microsoft
W3C model
三个阶段
一旦查找顺序确定,事件就会经历三个阶段:捕获阶段、目标阶段、冒泡阶段。如果一个阶段不支持则会跳过,或者一个阶段的 propagation 被停止,也会跳过。举个例子,如果
bubbles
属性呗设为 false,那么冒泡阶段就会被跳过。如果stopPropagation()
在之前被调用,那么所有阶段都会跳过。EventTarget.addEventListener()
type
:表示监听事件类型的字符串。listener
:当所监听的事件类型触发时,会接收到一个事件通知(实现了Event
接口的对象)对象。listener
必须是一个实现了EventListener
接口的对象,或者是一个函数。有关回调本身的详细信息,请参阅The event listener callbackoptions 可选
一个指定有关
listener
属性的可选参数对象。可用的选项如下:
capture
:Boolean
,表示listener
会在该类型的事件捕获阶段传播到该EventTarget
时触发。once
:Boolean
,表示listener 在添加之后最多只调用一次。如果是
true,
listener
会在其被调用之后自动移除。passive
:Boolean
,设置为true时,表示listener
永远不会调用preventDefault()
。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。查看 Improving scrolling performance with passive listeners 了解更多.mozSystemGroup
: 只能在 XBL 或者是 Firefox' chrome 使用,这是个Boolean
,表示listener
被添加到 system group。useCapture
可选Boolean
,在DOM树中,注册了listener的元素, 是否要先于它下面的EventTarget,调用该listener。 当useCapture(设为true) 时,沿着DOM树向上冒泡的事件,不会触发listener。当一个元素嵌套了另一个元素,并且两个元素都对同一事件注册了一个处理函数时,所发生的事件冒泡和事件捕获是两种不同的事件传播方式。事件传播模式决定了元素以哪个顺序接收事件。进一步的解释可以查看 事件流 及 JavaScript Event order 文档。 如果没有指定,useCapture
默认为 false 。wantsUntrusted
如果为
true
, 则事件处理程序会接收网页自定义的事件。此参数只适用于 Gecko(chrome的默认值为true,其他常规网页的默认值为false),主要用于附加组件的代码和浏览器本身。事件委托
冒泡还允许我们利用事件委托——这个概念依赖于这样一个事实,如果你想要在大量子元素中单击任何一个都可以运行一段代码,您可以将事件监听器设置在其父节点上,并让子节点上发生的事件冒泡到父节点上,而不是每个子节点单独设置事件监听器。
一个很好的例子是一系列列表项,如果你想让每个列表项被点击时弹出一条信息,您可以将
click
单击事件监听器设置在父元素上,这样事件就会从列表项冒泡到其父元素
上。The text was updated successfully, but these errors were encountered: