一个return false 引发的血案-js事件继承

问题描述

最近做一个项目,要给一个页面在顶部新增一个入口,本以为是个超级简单的事情,结果发现用a标签把点击元素包裹起来无效,给点击元素绑定事件也无效,一件本以为简单的事情,结果出了稀奇古怪的效果。

问题排查

一般而言是不会有这个原因的,为什么给元素加了事件,点击却不触发?是事件没绑定成功?在chrome里面的event listener里面检查,发现有点击事件。那么就是事件没绑定了却没触发。测试了一下,发现点击在子元素才不会触发事件。我们都知道子元素是会继承父元素的事件的。搜索了一下,终于找到鬼魁祸首 一个子元素的事件绑定中有 return false。

两种事件流

根据事件的传播顺序不同,分为两种事件流。

冒泡型事件流:从子节点向根节点传播。

捕获型事件流:从父节点到子节点。

现在我们使用的事件绝大多数都是冒泡型的,所有的现代浏览器都支持冒泡,一些老浏览器不支持捕获。

阻止事件继承

1.为子元素添加和父元素一样的事件,然后在子元素中阻止事件冒泡。eg:

$("#child").on('click',function(e){  
   e.cancelBubble = true;//ie
    e.stopPropagation();  //阻止事件冒泡
});
  1. 对于onmouseover 和mouseout 不能用上述方法来阻止事件冒泡,这个时候可以用 return false。eg:
function overOrOut(e,target){
    if(e.type != "mouseover" && e.type != "mouseout"){  
            return false;  
    } 
    //do otherthing
}

return false也能阻止事件冒泡,但是它不仅阻止了事件冒泡也阻止了事件本身,相当于阻塞了该事件,不再执行。而e.stopPropagation()只是阻止事件冒泡。

tips:链接等是有默认事件的,阻止事件冒泡前需要先阻止事件的默认事件 event.preventDefault或window.event.returnValue=false。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,526评论 1 11
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 1,629评论 2 10
  • js之事件机制 1、事件初探 1.1 js事件的概述 JavaScript事件:JavaScript是基于事件驱动...
    道无虚阅读 2,396评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,869评论 18 139
  • 一出喜剧 一首肖邦谱写的歌 一卷珠帘 一台收音机 一只看门的狗 我也写过诗 未命名的诗 我也唱过歌 未...
    see0502阅读 254评论 2 6