js阻止浏览器的默认行为以及停止事件冒泡

在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到“停止事件冒泡”和“阻止浏览器默认行为”。

1.阻止浏览器的默认行为

[java]  view plain copy
  1. function stopDefault(e) {  
  2.         //如果提供了事件对象,则这是一个非IE浏览器   
  3.         if(e && e.preventDefault) {  
  4.           //阻止默认浏览器动作(W3C)  
  5.           e.preventDefault();  
  6.         } else {  
  7.           //IE中阻止函数器默认动作的方式   
  8.           window.event.returnValue = false;   
  9.         }  
  10.         return false;  
  11.     }  


2.停止事件冒泡

[java]  view plain copy
  1. function stopBubble(e) {  
  2.     //如果提供了事件对象,则这是一个非IE浏览器  
  3.     if(e && e.stopPropagation) {  
  4.     //因此它支持W3C的stopPropagation()方法  
  5.     e.stopPropagation();   
  6.     } else {  
  7.     //否则,我们需要使用IE的方式来取消事件冒泡   
  8.     window.event.cancelBubble = true;  
  9.     }  
  10.     return false;   
  11. }  


  

具体应用实例:写好的一个项目,今天交给用户使用,返回了一大堆问题,其中有一个很精典:

一个页面,有一个表单,用来提交表单的按钮是个button,用jquery来响应这个按钮的点击动作,通过post提交,供用户输入的是一个文本框,用户输入完要填的东西之后,直接按回车键,就相当于按了那个button,刚开始没注意这个问题,一按回车,就跳转到了另外一个页面,查了很多资料,才发现要阻止浏览器的默认行为,,因为SUBMIT的默认行为是提交表单,那么你的JS就不会执行了。所以先取消默认行为。然后执行你的JQ来提交。具体的我也说不清楚,只知道若文本框的type="submit",直接点击按钮的时候就会跳到另外一个页面,若type="button",则点击按钮的时候不会出现这样的情况,可按回车键的时候会跳到另外一个页面,解决方法,看下面代码:

jsp代码:

[java]  view plain copy
  1. "text" name="appGrpName_s" id="appGrpName_s" οnkeydοwn="enter_down(this.form, event);"/>  

 

js代码:

[java]  view plain copy
  1. "text/javascript">  
  2.     function enter_down(form, event) {   
  3.       if(event.keyCode== "13") {  
  4.           stopDefault(event);  
  5.           submitForm(form,'actionDiv');  
  6.       }  
  7.     }  
  8.       
  9.     function stopDefault(e) {  
  10.         //如果提供了事件对象,则这是一个非IE浏览器   
  11.         if(e && e.preventDefault) {  
  12.           //阻止默认浏览器动作(W3C)  
  13.           e.preventDefault();  
  14.         } else {  
  15.           //IE中阻止函数器默认动作的方式   
  16.           window.event.returnValue = false;   
  17.         }  
  18.         return false;  
  19.     }  
  20.   

通过上面的代码就可以实现按回车的时候相当于点击“提交”按钮。且上面的代码兼容IE、FF浏览器。

 

有时候遇到需要屏蔽浏览器的一些快捷键行为时,比如说:ff下按Backspace键,会跳到上一个浏览器的历史记录页面;

注意要在onkeydown事件中调用stopDefault(event)函数,在onkeyup事件中调用是不成功的。

 

 

[javascript]  view plain copy
  1. "color:#339933"><a onclick"color:#339933">="color:#3366cc">"toggleFriendFuncList(event, '6708062', 'he');""color:#339933">>a"color:#339933">>  

由于href是空值,如果不阻止浏览器的默认行为,产生的效果就是刷新页面。
现在我们需要做的就是阻止href的链接事件,而去执行onclick事件。
老的处理方式:

[javascript]  view plain copy
  1. "color:#339933"><a onclick"color:#339933">="color:#3366cc">"toggleFriendFuncList(event, '6708062', 'he');" href"color:#339933">="color:#3366cc">"javascript:void(0);""color:#339933">>a"color:#339933">>  

 

 

jquery的写法:
1)return false :In event handler ,prevents default behavior and event bubbing 。
return false 在事件的处理中,可以阻止默认事件和冒泡事件。
2)event.preventDefault():In event handler ,prevent default event (allows bubbling) 。
event.preventDefault()在事件的处理中,可以阻止默认事件但是允许冒泡事件的发生。
3)event.stopPropagation():In event handler ,prevent bubbling (allows default behavior).
event.stopPropagation()在事件的处理中,可以阻止冒泡但是允许默认事件的发生

prototype的写法:
Event.stop(event)
用法介绍:
事件发生后,浏览器通常首先触发事件发生元素上的事件处理程序,然后是它的父元素,父元素的父元素……依此类推, 直到文档的根元素为止。这被称为 事件冒泡,是事件传播的最常见的方式。当处理好一个事件后, 你可能想要停止事件的传播,不希望它继续冒泡。
当你的程序有机会处理事件时,如果这个事件具有 默认行为,同时浏览器也会处理它。例如,点击导航链接、 将表单提交到服务器、在一个单行文本框中按下回车键等等。如果对这些事件你定义了自己的处理方式, 可能会非常希望阻止相关的默认行为。

 

 

但是,有时候还是不能解决相应的问题,明明已经调用了阻止浏览器默认行为的方法,可在按回车的时候还是会调用默认行为,最终也没有找到问题所在,只好把回车键禁用了,实际上是用Tab键代替回车键。代码如下:

[java]  view plain copy
  1. "javascript" event="onkeydown" for="document">  
  2.   //若为回车键  
  3.   if ( event.keyCode == 13 ) {  
  4.     //改成Tab键,这样每次按回车都起到了Tab的功效,光标跳到下一个对象  
  5.     event.keyCode = 9;  
  6.    }  
  7.   
  8.   
  9. "javascript" type="text/javascript">   
  10.   //禁用Enter键表单自动提交    
  11.       document.onkeydown = function(event) {    
  12.           var target, code, tag;    
  13.         if (!event) {    
  14.             event = window.event; //针对ie浏览器    
  15.             target = event.srcElement;    
  16.             code = event.keyCode;    
  17.             if (code == 13) {    
  18.                  tag = target.tagName;    
  19.                  if (tag == "TEXTAREA") { return true; }    
  20.                  else { return false; }    
  21.              }    
  22.          }    
  23.          else {    
  24.              target = event.target; //针对遵循w3c标准的浏览器,如Firefox    
  25.              code = event.keyCode;    
  26.             if (code == 13) {    
  27.                  tag = target.tagName;    
  28.                  if (tag == "INPUT") { return false; }    
  29.                  else { return true; }     
  30.             }    
  31.        }    
  32.      };    
  33.   


具体用法试例:

[java]  view plain copy
  1. "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  3. <%@ include file="/pages/common/global.jsp"%>  
  4.   
  5.   
  6.     高德软件  
  7.     "pragma" content="no-cache">  
  8.     "cache-control" content="no-cache">  
  9.     "expires" content="0">  
  10.     "Content-Type" content="text/html; charset=UTF-8"/>  
  11.   
  12.   
  13.   
  14.     "width: 100%; align: center;">  
  15.           
  16.             "text-align:left;">  
  17.                 "chance_search_div">  
  18.                 "appGrpAction.do?method=appGrpList">  
  19.                 class="form_t">  
  20.                       
  21.                         class="tablelogo">    查询  
  22.                             "hidden" name="hidden_s" value="1" />  
  23.                           
  24.                       
  25.                       
  26.                         "text-align: left; padding-left: 50px;">  
  27.                               
  28.                             名称   
  29.                             "text" name="appGrpName_s" id="appGrpName_s"  
  30.                                         οnblur="javascript:isSpecialChar(this);" οnkeydοwn="enter_down(this.form, event);"/>  
  31.                                                    
  32.                             "button" class="button4C" value="查 询"  
  33.                                             οnclick="javascript:submitForm(this.form,'actionDiv');" />    
  34.                             "button" value="添  加" class="button4C" οnclick="javascript:addAppGrp();"/>  
  35.           
  36.                                
  37.                           
  38.                       
  39.                    
  40.                   
  41.                   
  42.                 
  
  •                 "actionDiv">
  •   
  •               
  •           
  •       
  •          
  •   
  •  
  • 你可能感兴趣的:(javascript,javascript,默认行为,事件冒泡)