js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 # )

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

1..停止事件冒泡

JavaScript代码

//如果提供了事件对象,则这是一个非IE浏览器
if ( e && e.stopPropagation )
//因此它支持W3C的stopPropagation()方法
e.stopPropagation(); 
else
//否则,我们需要使用IE的方式来取消事件冒泡 
window.event.cancelBubble = true;
return false;

代码如下:

function stopBubble(e) {

  if ( e && e.stopPropagation )

      e.stopPropagation();

  else

      window.event.cancelBubble = true;

}

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

JavaScript代码

//如果提供了事件对象,则这是一个非IE浏览器 
if ( e && e.preventDefault ) 
//阻止默认浏览器动作(W3C) 
e.preventDefault(); 
else
//IE中阻止函数器默认动作的方式 
window.event.returnValue = false; 
return false;

代码如下:

function stopDefault( e ) {

    if ( e && e.preventDefault )

        e.preventDefault();

    else

        window.event.returnValue = false;

    return false;

}

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

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

jsp代码:

<input type="text" name="appGrpName_s" id="appGrpName_s" onkeydown="enter_down(this.form, event);"/>

js代码:

<script type="text/javascript">
    function enter_down(form, event) {
      if(event.keyCode== "13") {
	      stopDefault(event);
	      submitForm(form,‘actionDiv‘);
      }
    }

    function stopDefault(e) {
		//如果提供了事件对象,则这是一个非IE浏览器
		if(e && e.preventDefault) {
		  //阻止默认浏览器动作(W3C)
		  e.preventDefault();
		} else {
		  //IE中阻止函数器默认动作的方式
		  window.event.returnValue = false;
		}
		return false;
	}
</script>

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

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

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

<a onclick="toggleFriendFuncList(event, ‘6708062‘, ‘he‘);"></a>

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

<a onclick="toggleFriendFuncList(event, ‘6708062‘, ‘he‘);" href="javascript:void(0);"></a>

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键代替回车键。代码如下:

<script language="javascript" event="onkeydown" for="document">
  //若为回车键
  if ( event.keyCode == 13 ) {
    //改成Tab键,这样每次按回车都起到了Tab的功效,光标跳到下一个对象
    event.keyCode = 9;
   }
</script>

<script language="javascript" type="text/javascript">
  //禁用Enter键表单自动提交
      document.onkeydown = function(event) {
          var target, code, tag;
        if (!event) {
            event = window.event; //针对ie浏览器
            target = event.srcElement;
            code = event.keyCode;
            if (code == 13) {
                 tag = target.tagName;
                 if (tag == "TEXTAREA") { return true; }
                 else { return false; }
             }
         }
         else {
             target = event.target; //针对遵循w3c标准的浏览器,如Firefox
             code = event.keyCode;
            if (code == 13) {
                 tag = target.tagName;
                 if (tag == "INPUT") { return false; }
                 else { return true; }
            }
       }
     };
</script>

具体用法试例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="/pages/common/global.jsp"%>
<html>
<head>
	<title>高德软件</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script>
	function gotoPage(currentPage,form) {
		goto_Page(currentPage,form,"actionDiv");
	}
	function addAppGrp(){
		$("#actionDiv").load("${contextPath }/pages/manage/business/add.jsp");
		$("#chance_search_div").hide();
	}
	function modifyAppGrp(idName){
		var id=encodeURIComponent(idName);
		var url = contextName + "/appGrpAction.do?method=addAppGrp&appGrpName="+id;
		retrieveURL(url,‘actionDiv‘);
		$("#chance_search_div").hide();
	}
	function savebusiness(thisForm){
		var name = $("#appGrpName").val();
		if(name.trim()==""){
			alert("分组名称不能为空。");
			return;
		}
		submitForm(thisForm,null,afterSave);
		return ;
	}
	function afterSave(content){
		if(content!=null&&content!=""){
			var arr = content.split(",");
			if(arr[0]=="true"){
				$("#chance_search_div").show();
				//当前结点
				var itemId = "0::" + $("#appGrpName").val();
				//父结点,因为只有添加根应用分组时才会执行这个方法,所以父结点统一为-1
				var parentId = -1;
				//当前结点显示名称
				var itemText = $("#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;
	}
	function deleteBusiness(thisForm,idName){
		if(confirm("确认要删除么?")){
			var id=encodeURIComponent(idName);
			retrieveURL("${contextPath}/appGrpAction.do?method=deleteAppGrp&appGrpName=" + id,null,null,function(content){
				if(content!=null&&content!=""){
					var arr = content.split(",");
					if(arr.length==3&&arr[2]==‘y‘){
						var msg = "该应用组下有应用,要强制删除么?";
						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 ;
		}
	}
	function afterForceDel(){
		if(content!=null&&content!=""){
			var arr = content.split(",");
			if(arr[0]=="true"){
				monitorTree();
				retrieveURL("${contextPath}/appGrpAction.do?method=appGrpList","actionDiv");
				return;
			}
			alert(arr[1]);
			return;
		}
		alert("保存失败");
		return;
	}

	function enter_down(form, event) {
      if(event.keyCode== "13") {
	      stopDefault(event);
	      submitForm(form,‘actionDiv‘);
      }
    }

    function stopDefault(e) {
		//如果提供了事件对象,则这是一个非IE浏览器
		if(e && e.preventDefault) {
		  //阻止默认浏览器动作(W3C)
		  e.preventDefault();
		} else {
		  //IE中阻止函数器默认动作的方式
		  window.event.returnValue = false;
		}
		return false;
	}
</script>
</head>
<body>
	<table style="width: 100%; align: center;">
		<tr>
			<td style="text-align:left;">
				<div id="chance_search_div">
				<html:form action="appGrpAction.do?method=appGrpList">
				<table class="form_t">
					<tr>
						<th class="tablelogo">	查询
							<input type="hidden" name="hidden_s" value="1" />
					 	</th>
					</tr>
					<tr>
						<td style="text-align: left; padding-left: 50px;">
							<br />
							名称 
							<input type="text" name="appGrpName_s" id="appGrpName_s"
										onblur="javascript:isSpecialChar(this);" onkeydown="enter_down(this.form, event);"/>
												 
							<input type="button" class="button4C" value="查 询"
											onclick="javascript:submitForm(this.form,‘actionDiv‘);" />  
							<input type="button" value="添  加" class="button4C" onclick="javascript:addAppGrp();"/>

							<br /> 
						</td>
					</tr>
				 </table>
				</html:form>

				</div>
				<div id="actionDiv"></div>
			</td>
		</tr>
	</table>
	<script><!--
		$("#actionDiv").load("${contextPath }/appGrpAction.do?method=appGrpList&random=" + Math.random());
	--></script>
</body>
</html>
时间: 2024-10-27 01:13:27

js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 # )的相关文章

js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)

在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到"停止事件冒泡"和"阻止浏览器默认行为". 1..停止事件冒泡 JavaScript代码 //如果提供了事件对象,则这是一个非IE浏览器if ( e && e.stopPropagation )//因此它支持W3C的stopPropagation()方法e.stopPropagation(); else//否则,我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubb

javascript阻止事件冒泡和浏览器的默认行为

/*---------------------------    功能:停止事件冒泡    ---------------------------*/    function stopBubble(e) {        //如果提供了事件对象,则这是一个非IE浏览器        if ( e && e.stopPropagation )            //因此它支持W3C的stopPropagation()方法            e.stopPropagation();  

js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交,兼容IE、FF浏览器) 转

1.阻止浏览器的默认行为 function stopDefault(e) { //如果提供了事件对象,则这是一个非IE浏览器 if(e && e.preventDefault) { //阻止默认浏览器动作(W3C) e.preventDefault(); } else { //IE中阻止函数器默认动作的方式 window.event.returnValue = false; } return false; } 2.停止事件冒泡 function stopBubble(e) { //如果提供

js中阻止事件冒泡和浏览器默认行为

在使用javascript编程时会遇到一个问题,就是当你给html添加事件时,由于浏览器默认的为冒泡型事件触发机制,所以会触发你不想触发的事件.那么通过如下的函数可以解决这个问题.[兼容IE和FF] 1.阻止事件冒泡,使成为捕获型事件触发机制. function stopBubble(e) { //如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) //因此它支持W3C的stopPropagation()方法 e.stopPropagat

JS如果阻止事件冒泡和浏览器默认事件

原地址:http://missra.com/article/web-57.html 嵌套的标签元素,如果父元素和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下JavaScript阻止默认事件与JavaScript阻止事件冒泡示例. (1)阻止冒泡事件 注:嵌套元素一般都存在冒泡事件,会带来某些影响 最外层标签:outer,中间层标签:center,最内层标签:inner,并且在outer.center.inner都添加了alert弹框事件,在正常思维情况下

javascript 停止事件冒泡以及阻止默认事件冒泡

停止事件冒泡 function stopBubble(e) { // 如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) { // 因此它支持W3C的stopPropagation()方法 e.stopPropagation(); } else { // 否则,我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubble = true; } 阻止事件冒泡 function stopDefault( e ) {

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

在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到"停止事件冒泡"和"阻止浏览器默认行为". 1..停止事件冒泡 JavaScript代码 //如果提供了事件对象,则这是一个非IE浏览器if ( e && e.stopPropagation )//因此它支持W3C的stopPropagation()方法e.stopPropagation(); else//否则,我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubb

浅谈js的事件冒泡机制

很多人都听说过,js的事件冒泡机制,其实,这个说法还是比较生动形象的,就是一个水泡在水底下,冒泡到水面的过程. 那js的事件冒泡机制呢,就是一个DOM树,一级一级向上冒的过程,最终是到document这个根节点这里. 这里就有一个小细节,dom点击后,它所有的父级都会触发事件,每一级绑定的事件都会触发,这样是耗费事件和性能进行处理的,但是,如果我们把事件都绑定到document根节点,这样只需要在最后一级的时候,区别是那个dom触发的就行了,这个也叫事件委托. 其实这个场景适用于,子节点和众多父

js之事件冒泡和事件捕获及其阻止详细介绍

虽然精通jquery,但对它的原型javascript却不是很了解,最近在学习javascript中遇到了一些困难,比如冒泡和捕获,很多次被提到,但又不知究竟应用在何处.找到了一些好文章解惑,在这里分享给大家 一.事件的发生顺序 这个问题的起源非常简单,假设你在一个元素中又嵌套了另一个元素 复制代码代码如下: -----------------------------------| element1                        ||   --------------------