Js 冒泡事件阻止实现代码 |
本文标签:冒泡事件,事件冒泡 1. 事件目标 复制代码 代码如下: $(document).ready(function(){ $(#switcher).click(function(event){ $(#switcher .button).toggleClass(hidden); }) }) $(document).ready(function(){ $(#switcher).click(function(event){ if(event.target==this){ $(#switcher .button).toggleClass(hidden); } }) }) 此时的代码确保了被单击的元素是<div id="switcher"> ,而不是其他后代元素 。现在,单击按钮不会再折叠样式转换器,而单击边框则会触发折叠操作 。但是,单击标签同样什么也不会发生,因为它也是一个后代元素 。实际上,我们可以不把检查代码放在这里,而是通过修改按钮的行为来达到目标 。 2. 停止事件传播 事件对象还提供了一个.stopPropagation()方法,该方法可以完全阻止事件冒泡 。与.target类似,这个方法也是一种纯JavaScript特性,但在跨浏览器的环境中则无法安全地使用 。不过,只要我们通过jQuery来注册所有的事件处理程序,就可以放心地使用这个方法 。 复制代码 代码如下: $(document).ready(function(){ $(#switcher .button).click(funtion(event){ //…… event.stopPropagation(); }) }) 同以前一样,需要为用作单击处理程序的函数添加一个参数,以便访问事件对象 。然后,通过简单地调用event.stopPropagation()就可以避免其他所有DOM元素响应这个事件 。这样一来,单击按钮的事件会被按钮处理,而且只会被按钮处理 。单击样式转换器的其他地方则可以折叠和扩展整个区域 。 3. 默认操作 如果我们把单击事件处理程序注册到一个锚元素,而不是一个外层的<div>上,那么就要面对另外一个问题:当用户单击链接时,浏览器会加载一个新页面 。这种行为与我们讨论的事件处理程序不是同一个概念,它是单击锚元素的默认操作 。类似地,当用户在编辑完表单后按下回车键时,会触发表单的submit事件,在此事件发生后,表单提交才会真正发生 。 补充: 复制代码 代码如下: //单击按钮事件(改变文字样式) $(document).ready(function() { $(#switcher .button).click(function() { $(body).removeClass(); if (this.id == switcher-narrow) { $(body).addClass(narrow); } else if (this.id == switcher-large) { $(body).addClass(large); } $(#switcher .button).removeClass(selected); $(this).addClass(selected); }); }); //单击按钮外层div出发事件(隐藏按钮) 现在的问题是,当点击了按钮时,同时触发了隐藏按钮事件 。这是事件冒泡导致 。 为了阻止事件冒泡,需要为隐藏按钮函数添加一个参数: 复制代码 代码如下: $(document).ready(function() { $(#switcher).click(function(even) { if(even.target==this){ $(#switcher .button).toggleClass(hidden); } }); }); even保存事件对象,even.target属性保存发生事件的目标元素 。可以确定DOM中首先接收到事件的元素 。此时代码确保了被单击的是<div id="switcher">,而不是其后代元素 。 也可以这样处理,通过修改按钮的行为来达到目的 。 复制代码 代码如下: $(document).ready(function() { $(#switcher .button).click(function(even) { $(body).removeClass(); if (this.id == switcher-narrow) { $(body).addClass(narrow); } else if (this.id == switcher-large) { $(body).addClass(large); } $(#switcher .button).removeClass(selected); $(this).addClass(selected); even.stopPropagation(); }); }); 用JS阻止事件冒泡 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发 。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层 。 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script type="text/javascript"> function aaaclick(){ alert("td click"); } function bbbclick(evt){ alert("td click"); if (window.event) { event.cancelBubble = true; }else if (evt){ evt.stopPropagation(); } } function trclick(){ alert("tr click"); } function tableclick(){ <style type="text/css"> <body> |