如何使用内联onclick属性来停止事件传播?

考虑以下几点:

<div onclick="alert('you clicked the header')" class="header"> <span onclick="alert('you clicked inside the header');">something inside the header</span> </div> 

我怎么能这样做,当用户点击跨度,它不触发div的点击事件?

event.stopPropagation()

编辑:对于IE: window.event.cancelBubble = true

所以在这种情况下应用这个,你可以这样做到子元素:

 <span onclick="event.stopPropagation(); alert('you clicked inside the header');" window.event.cancelBubble = "true">something inside the header</span> 

有两种方法从函数内部获取事件对象:

  1. 第一个参数在符合W3C标准的浏览器(Chrome,Firefox,Safari,IE9 +)中,
  2. Internet Explorer中的window.event对象(<= 8)

如果您需要支持不遵循W3Cbuild议的传统浏览器,则通常在函数内部使用如下所示的内容:

 function(e) { var event = e || window.event; [...]; } 

它将检查第一个,然后另一个存储在事件variables内部。 但是,在内联事件处理程序中,不存在要使用的e对象。 在这种情况下,您必须利用始终可用的arguments集合,并引用传递给函数的完整参数集合:

 onclick="var event = arguments[0] || window.event; [...]" 

但是,一般来说,如果您需要任何复杂的停止传播,您应该避免内联事件处理程序。 单独编写事件处理程序并将它们附加到元素是中长期更好的主意,无论是为了可读性还是可维护性。

请记住,window.event在FireFox中不受支持,因此它必须符合以下条件:

 e.cancelBubble = true 

或者,您可以使用FireFox的W3C标准:

 e.stopPropagation(); 

如果你想要看起来,你可以这样做:

 function myEventHandler(e) { if (!e) e = window.event; //IE9 & Other Browsers if (e.stopPropagation) { e.stopPropagation(); } //IE8 and Lower else { e.cancelBubble = true; } } 

使用这个函数,它会testing是否存在正确的方法。

 function disabledEventPropagation(event) { if (event.stopPropagation){ event.stopPropagation(); } else if(window.event){ window.event.cancelBubble=true; } } 

我有同样的问题 – 在IE浏览器的JS错误框 – 这在所有的浏览器正常工作,据我所知(event.cancelBubble = true在IE中的工作)

 onClick="if(event.stopPropagation){event.stopPropagation();}event.cancelBubble=true;" 

这对我有效

 <script> function cancelBubble(e) { var evt = e ? e:window.event; if (evt.stopPropagation) evt.stopPropagation(); if (evt.cancelBubble!=null) evt.cancelBubble = true; } </script> <div onclick="alert("Click!")"> <div onclick="cancelBubble(event)">Something inside the other div</div> </div> 

对于ASP.NET网页(而不是MVC),可以使用Sys.UI.DomEvent对象作为本机事件的包装。

 <div onclick="event.stopPropagation();" ... 

或者,将事件作为parameter passing给内部函数:

 <div onclick="someFunction(event);" ... 

并在一些function:

 function someFunction(event){ event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used // other onclick logic } 

根据这个页面 ,在IE中你需要:

event.cancelBubble = true

这也适用 – 在链接HTML使用onclick与返回这样的:

 <a href="mypage.html" onclick="return confirmClick();">Delete</a> 

然后comfirmClick()函数应该是这样的:

 function confirmClick() { if(confirm("Do you really want to delete this task?")) { return true; } else { return false; } }; 

为什么不检查哪个元素被点击? 如果你点击某个东西, window.event.target被分配给被点击的元素,被点击的元素也可以作为parameter passing。

如果目标和要素不相等,那就是一个传播的事件。

 function myfunc(el){ if (window.event.target === el){ // perform action } } <div onclick="myfunc(this)" /> 
 <div onclick="alert('you clicked the header')" class="header"> <span onclick="alert('you clicked inside the header'); event.stopPropagation()"> something inside the header </span> </div>