欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS阻止事件冒泡和事件默认行为

程序员文章站 2022-03-04 13:24:57
...

事件常见属性和方法

事件对象的常见属性 方法
e.target 返回触发 事件的对象 标准
e.srcElement 返回触发 事件的对象 非标准 IE 678使用
e.type 返回事件的类型比如 click mouseover 不带on
e.cancelBubble 该属性阻止冒泡非标准 IE 678使用
e.returnvalue 该属性阻止默认事件(默认行为) 非标准IE 678使用比如不让链接跳转
e.preventDefault 该方法阻止默认事件(默认行为)标准比如不让链接跳转
e.stopPropagation 阻止冒泡 标准

[示例 1.](返回触发事件对象)

// 1. e.target 返回的是触发事件的对象(元素)  this 返回的是绑定事件的对象(元素)

// 区别 : e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁

var ul = document.querySelector('ul');
ul.addEventListener('click',function(e) {
    console.log(this);
    console.log(e.target);

    //e.currentTarget 跟this 非常相似的属性 但是IE 678不认识
    console.log(e.currentTarget); 
})

// 了解兼容性
// ul.onclick = function(e) {
//     e = e || window.event;
//     var target = e.target || e.srcElement;
//     console.log(target);

[示例 2.](返回事件类型)

<div>123</div>
var dic = document.querySelector('div');
div.addEventListerence = function('click',fn);
div.addEventListerence = function('mouseover',fn);
div.addEventListerence = function('mouseout',fn);
function fn(e) {
    console.log(e.type);
}

[示例 3.](阻止事件默认行为)

<div>123</div>
    <a href="http://www.baidu.com">百度</a>
<form action="http://www.baidu.com">
     <input type="submit" value="提交" name="sub">
</form>
// 2. 阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交
var a = document.querySelector('a');
a.addEventListener('click', function(e) {
    e.preventDefault(); //  dom 标准写法
})

// 3. 传统的注册方式
a.onclick = function(e) {
    // 普通浏览器 e.preventDefault();  方法
    // e.preventDefault();
    // 低版本浏览器 ie678  returnValue  属性
    // e.returnValue;
    // 我们可以利用return false 也能阻止默认行为 没有兼容性问题 
    // 特点: return 后面的代码不执行了, 而且只限于传统的注册方式
    return false;
    alert(11);
}

阻止事件冒泡(面试问题⭐)

阻止事件冒泡的两种方式

事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到刭DOM最顶层节点。

事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要们灵活掌握。

阻止方式:

  • 标准写法:利用事件对象里面的 stopPropagation()方法
e.stopPropagation();
  • 非标准写法: IE 678利用事件对象 cancelBubble属性
window.event.cancelBubble= true;  //非标准 cancel取消 bubble 泡泡

[示例 4.](阻止事件冒泡)

// 常见事件对象的属性和方法
// 阻止冒泡  dom 推荐的标准 stopPropagation() 
var son = document.querySelector('.son');
son.addEventListener('click', function(e) {
    alert('son');
    e.stopPropagation(); 	// stop 停止  Propagation 传播
    e.cancelBubble = true; 	// 非标准 cancel 取消 bubble 泡泡
}, false);
// father 没有阻止事件冒泡 ,点击father还是会一级一级向上冒泡
var father = document.querySelector('.father');
father.addEventListener('click', function() {
    alert('father');
}, false);
document.addEventListener('click', function() {
    alert('document');
})

阻止事件冒泡兼容性解决方案【函数封装】

if(e.stopPropagation) {
	e.stopPropagation();
} else {
	window.event.cancelBubble = true;
}

事件委托(代理、委派)

事件委托也称为事件代理, 在 jQuery里面称为事件委派。

事件委托原理

不用给每个子节点单独设置事件监听器, 而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。

有如下案例: 给 ul 注册点击事件,然后利用事件对象的 target来找到当前点击的 li ,因为点击 li ,事件会冒泡到 ul 上, ul 有注册事件,就会触发事件监听器。

事件委托作用

我们只操作了一次 DOM,提高了程序的性能。

【加深理解】

生活中有如下场景
咱们班有100个学生,快递员有100个快递,如果个个的送花费时间较长。同时每个学生领取的时候,也需
要排队领取,也花费时间较长,何如?

解决方案: 快递员把100个快递,委托给班主任,班主任把这些快递放到办公室,同学们下课自行领取即可。

优势: 快递员省事,委托给班主任就可以走了。同学们领取也方便,因为相信班主任

【事件冒泡案例】

事件冒泡本身的特性, 会带来的坏处,也会 带来的好处, 需要我们灵活掌握。程序中也有如此场景:

<ul>
    <li>我是1</li>
    <li>我是2</li>
    <li>我是3</li>
    <li>我是4</li>
    <li>我是5</li>
    <li>我是6</li>
</ul>

点击每个都会弹出对话框,以前需要给每个注册事件, 这是非常辛苦的, 而目访问DOM的次数越多,这就

会延长整个页面的交互就绪时间。

 // 利用事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点
var ul = document.querySelector('ul');
ul.addEventListener('mousemove',function(e) {
    e.target.style.background = 'pink';
});
ul.addEventListener('mouseout',function(e) {
    e.target.style.background = '';
});

JS阻止事件冒泡和事件默认行为

e.preventDefault 阻止鼠标事件

1.禁止鼠标右键菜单

contextmenu 主要控制应该何时显示上下文菜单,主要用于程序取消默认的上下文菜单

// 阻止鼠标右键
document.addEventListener('contextmenu',function(e) {
    e.preventDefault();
})

2.禁止鼠标选中(selectstart 开始选中)

//阻止鼠标选中
document.addEventListener('selectstart',function(e) {
    e.preventDefault();
})
相关标签: ECMAScript