通常使用addEventListener
注册事件,该函数的第三个参数可以是布尔值,也可以是对象,默认值为false
,决定了注册的事件是捕获事件(true)还是冒泡事件。 一般来说,如果我们只希望事件只触发在目标上,这时候可以使用
target
是触发事件的某个具体的对象,只会出现在事件机制的目标阶段,即"谁触发了事件,谁就是target"。 currentTarget
是绑定了当前事件类型的对象,有可能是目标节点的祖先节点。
w3c的方法是e.preventDefault()
,早期版本的IE浏览器使用e.returnValue = false
。
/**
* 兼容的取消事件默认行为
*/
function cancelHandler(event) {
var event = event || window.event; //用于IE
if(event.preventDefault){
event.preventDefault(); //标准技术
}
if(event.returnValue){
event.returnValue = false; //IE
}
}
<!-- 例子结构 -->
<div id="outer">
<p id="inner"></p>
</div>
event.stopPropagation
阻止事件在冒泡阶段传播。
/**
* 点击#inner之后会发生如下过程:
* outer捕获阶段
* inner 一
* inner 二
* inner 三
*/
const inner = document.querySelector('#inner');
const outer = document.querySelector('#outer');
inner.addEventListener("click", event => {
console.log("inner 一");
}, false);
inner.addEventListener("click", event => {
console.log("inner 二");
event.stopPropagation();
}, false);
inner.addEventListener("click",event => {
console.log("inner 三");
}, false);
outer.addEventListener("click", event => {
console.log("outer捕获阶段");
}, false);
outer.addEventListener("click", event => {
console.log("outer冒泡阶段");
}, false);
如果有多个相同类型事件的事件监听函数绑定到同一个元素,当该类型的事件触发时,它们会按照被添加的顺序执行。如果其中某个监听函数执行了event.stopImmediatePropagation()
方法,则当前元素剩下的监听函数将不会被执行,并且阻止事件在冒泡阶段传播。
/**
* 点击#inner之后会发生如下过程:
* outer捕获阶段
* inner 一
* inner 二
*/
const inner = document.querySelector('#inner');
const outer = document.querySelector('#outer');
inner.addEventListener("click", (event) => {
console.log("inner 一");
}, false);
inner.addEventListener("click", (event) => {
console.log("inner 二");
event.stopImmediatePropagation();
}, false);
inner.addEventListener("click",(event) => {
console.log("inner 三");
}, false);
outer.addEventListener("click", event => {
console.log("outer捕获阶段");
}, false);
outer.addEventListener("click", event => {
console.log("outer冒泡阶段");
}, false);
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。