js阻止默认浏览器行为与冒泡行为的实现代码
在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到“停止事件冒泡”和“阻止浏览器默认行为”。
1.阻止浏览器的默认行为
functionstopDefault(e){ //如果提供了事件对象,则这是一个非IE浏览器 if(e&&e.preventDefault){ //阻止默认浏览器动作(W3C) e.preventDefault(); }else{ //IE中阻止函数器默认动作的方式 window.event.returnValue=false; } returnfalse; }
2.停止事件冒泡
functionstopBubble(e){ //如果提供了事件对象,则这是一个非IE浏览器 if(e&&e.stopPropagation){ //因此它支持W3C的stopPropagation()方法 e.stopPropagation(); }else{ //否则,我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubble=true; } returnfalse; }
具体应用实例:写好的一个项目,今天交给用户使用,返回了一大堆问题,其中有一个很精典:
一个页面,有一个表单,用来提交表单的按钮是个button,用jquery来响应这个按钮的点击动作,通过post提交,供用户输入的是一个文本框,用户输入完要填的东西之后,直接按回车键,就相当于按了那个button,刚开始没注意这个问题,一按回车,就跳转到了另外一个页面,查了很多资料,才发现要阻止浏览器的默认行为,,因为SUBMIT的默认行为是提交表单,那么你的JS就不会执行了。所以先取消默认行为。然后执行你的JQ来提交。具体的我也说不清楚,只知道若文本框的type="submit",直接点击按钮的时候就会跳到另外一个页面,若type="button",则点击按钮的时候不会出现这样的情况,可按回车键的时候会跳到另外一个页面,解决方法,看下面代码:
<inputtype="text"name="appGrpName_s"id="appGrpName_s"onkeydown="enter_down(this.form,event);"/>
<scripttype="text/javascript"> functionenter_down(form,event){ if(event.keyCode=="13"){ stopDefault(event); submitForm(form,'actionDiv'); } } functionstopDefault(e){ //如果提供了事件对象,则这是一个非IE浏览器 if(e&&e.preventDefault){ //阻止默认浏览器动作(W3C) e.preventDefault(); }else{ //IE中阻止函数器默认动作的方式 window.event.returnValue=false; } returnfalse; } </script>
通过上面的代码就可以实现按回车的时候相当于点击“提交”按钮。且上面的代码兼容IE、FF浏览器。
有时候遇到需要屏蔽浏览器的一些快捷键行为时,比如说:ff下按Backspace键,会跳到上一个浏览器的历史记录页面;
注意要在onkeydown事件中调用stopDefault(event)函数,在onkeyup事件中调用是不成功的。
<spanstyle="color:rgb(51,153,51);"><</span>aonclick<spanstyle="color:rgb(51,153,51);">=</span><spanstyle="color:rgb(51,102,204);">"toggleFriendFuncList(event,'6708062','he');"</span><spanstyle="color:rgb(51,153,51);">></</span>a<spanstyle="color:rgb(51,153,51);">></span>
由于href是空值,如果不阻止浏览器的默认行为,产生的效果就是刷新页面。
现在我们需要做的就是阻止href的链接事件,而去执行onclick事件。
老的处理方式:
<spanstyle="color:rgb(51,153,51);"><</span>aonclick<spanstyle="color:rgb(51,153,51);">=</span><spanstyle="color:rgb(51,102,204);">"toggleFriendFuncList(event,'6708062','he');"</span>href<spanstyle="color:rgb(51,153,51);">=</span><spanstyle="color:rgb(51,102,204);">"javascript:void(0);"</span><spanstyle="color:rgb(51,153,51);">></</span>a<spanstyle="color:rgb(51,153,51);">></span>
jquery的写法:
1)returnfalse:Ineventhandler,preventsdefaultbehaviorandeventbubbing。
returnfalse在事件的处理中,可以阻止默认事件和冒泡事件。
2)event.preventDefault():Ineventhandler,preventdefaultevent(allowsbubbling)。
event.preventDefault()在事件的处理中,可以阻止默认事件但是允许冒泡事件的发生。
3)event.stopPropagation():Ineventhandler,preventbubbling(allowsdefaultbehavior).
event.stopPropagation()在事件的处理中,可以阻止冒泡但是允许默认事件的发生
prototype的写法:
Event.stop(event)
用法介绍:
事件发生后,浏览器通常首先触发事件发生元素上的事件处理程序,然后是它的父元素,父元素的父元素……依此类推,直到文档的根元素为止。这被称为事件冒泡,是事件传播的最常见的方式。当处理好一个事件后,你可能想要停止事件的传播,不希望它继续冒泡。
当你的程序有机会处理事件时,如果这个事件具有默认行为,同时浏览器也会处理它。例如,点击导航链接、将表单提交到服务器、在一个单行文本框中按下回车键等等。如果对这些事件你定义了自己的处理方式,可能会非常希望阻止相关的默认行为。
但是,有时候还是不能解决相应的问题,明明已经调用了阻止浏览器默认行为的方法,可在按回车的时候还是会调用默认行为,最终也没有找到问题所在,只好把回车键禁用了,实际上是用Tab键代替回车键。代码如下:
<scriptlanguage="javascript"event="onkeydown"for="document"> //若为回车键 if(event.keyCode==13){ //改成Tab键,这样每次按回车都起到了Tab的功效,光标跳到下一个对象 event.keyCode=9; } </script> <scriptlanguage="javascript"type="text/javascript"> //禁用Enter键表单自动提交 document.onkeydown=function(event){ vartarget,code,tag; if(!event){ event=window.event;//针对ie浏览器 target=event.srcElement; code=event.keyCode; if(code==13){ tag=target.tagName; if(tag=="TEXTAREA"){returntrue;} else{returnfalse;} } } else{ target=event.target;//针对遵循w3c标准的浏览器,如Firefox code=event.keyCode; if(code==13){ tag=target.tagName; if(tag=="INPUT"){returnfalse;} else{returntrue;} } } }; </script>
具体用法试例:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%> <%@includefile="/pages/common/global.jsp"%> <html> <head> <title>毛票票</title> <metahttp-equiv="pragma"content="no-cache"> <metahttp-equiv="cache-control"content="no-cache"> <metahttp-equiv="expires"content="0"> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/> <script> functiongotoPage(currentPage,form){ goto_Page(currentPage,form,"actionDiv"); } functionaddAppGrp(){ $("#actionDiv").load("${contextPath}/pages/manage/business/add.jsp"); $("#chance_search_div").hide(); } functionmodifyAppGrp(idName){ varid=encodeURIComponent(idName); varurl=contextName+"/appGrpAction.do?method=addAppGrp&appGrpName="+id; retrieveURL(url,'actionDiv'); $("#chance_search_div").hide(); } functionsavebusiness(thisForm){ varname=$("#appGrpName").val(); if(name.trim()==""){ alert("分组名称不能为空。"); return; } submitForm(thisForm,null,afterSave); return; } functionafterSave(content){ if(content!=null&&content!=""){ vararr=content.split(","); if(arr[0]=="true"){ $("#chance_search_div").show(); //当前结点 varitemId="0::"+$("#appGrpName").val(); //父结点,因为只有添加根应用分组时才会执行这个方法,所以父结点统一为-1 varparentId=-1; //当前结点显示名称 varitemText=$("#appGrpName").val(); //添加新结点 tree.insertNewChild(parentId,itemId,itemText,doOnClick,'myfolderClosed.gif','myfolderOpen.gif','myfolderClosed.gif'); retrieveURL("${contextPath}/appGrpAction.do?method=appGrpList","actionDiv"); return; } alert(arr[1]); return; } alert("保存失败"); return; } functiondeleteBusiness(thisForm,idName){ if(confirm("确认要删除么?")){ varid=encodeURIComponent(idName); retrieveURL("${contextPath}/appGrpAction.do?method=deleteAppGrp&appGrpName="+id,null,null,function(content){ if(content!=null&&content!=""){ vararr=content.split(","); if(arr.length==3&&arr[2]=='y'){ varmsg="该应用组下有应用,要强制删除么?"; if(confirm(msg)){ retrieveURL("${contextPath}/appGrpAction.do?method=forceDelAppGrp&appGrpName="+id,null,null,afterForceDel); } return; } if(arr.length==2){ if(arr[0]=="true"){ //当前结点 itemId="0::"+idName; tree.deleteItem(itemId); retrieveURL("${contextPath}/appGrpAction.do?method=appGrpList","actionDiv"); return; } alert(arr[1]); } return; } alert("删除失败"); return; }); return; } } functionafterForceDel(){ if(content!=null&&content!=""){ vararr=content.split(","); if(arr[0]=="true"){ monitorTree(); retrieveURL("${contextPath}/appGrpAction.do?method=appGrpList","actionDiv"); return; } alert(arr[1]); return; } alert("保存失败"); return; } functionenter_down(form,event){ if(event.keyCode=="13"){ stopDefault(event); submitForm(form,'actionDiv'); } } functionstopDefault(e){ //如果提供了事件对象,则这是一个非IE浏览器 if(e&&e.preventDefault){ //阻止默认浏览器动作(W3C) e.preventDefault(); }else{ //IE中阻止函数器默认动作的方式 window.event.returnValue=false; } returnfalse; } </script> </head> <body> <tablestyle="width:100%;align:center;"> <tr> <tdstyle="text-align:left;"> <divid="chance_search_div"> <html:formaction="appGrpAction.do?method=appGrpList"> <tableclass="form_t"> <tr> <thclass="tablelogo">查询 <inputtype="hidden"name="hidden_s"value="1"/> </th> </tr> <tr> <tdstyle="text-align:left;padding-left:50px;"> <br/> 名称 <inputtype="text"name="appGrpName_s"id="appGrpName_s" onblur="javascript:isSpecialChar(this);"onkeydown="enter_down(this.form,event);"/> <inputtype="button"class="button4C"value="查询" onclick="javascript:submitForm(this.form,'actionDiv');"/> <inputtype="button"value="添加"class="button4C"onclick="javascript:addAppGrp();"/> <br/> </td> </tr> </table> </html:form> </div> <divid="actionDiv"></div> </td> </tr> </table> <script><!-- $("#actionDiv").load("${contextPath}/appGrpAction.do?method=appGrpList&random="+Math.random()); --></script> </body> </html>
以上这篇js阻止默认浏览器行为与冒泡行为的实现代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。