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

IT技术 javascript html events dom
2021-01-13 08:49:02

考虑以下:

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

我怎样才能做到这一点,当用户单击跨度时,它不会触发div's click 事件?

6个回答

使用event.stopPropagation()

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

对于 IE: window.event.cancelBubble = true

<span onclick="window.event.cancelBubble = true; alert('you clicked inside the header');">something inside the header</span>
在 Firefox 中,您可以访问内联脚本中的变量事件,但 window.event 不可用。<div onclick="alert(event);"></div>
2021-03-15 08:49:02
这是错误的 - 内联 onclick 处理程序不会将事件作为参数传递。正确的解决方案是下面的 Gareths。
2021-03-16 08:49:02
事件对象是回调的参数。实际上,IE 中没有事件对象这样的东西,因为这个对象可以通过 window.event 访问,而不是作为函数的参数:-)
2021-03-17 08:49:02
FireFox 中没有事件对象这样的东西。
2021-03-18 08:49:02
event 似乎也可用于 IOS Safari 的内联事件。
2021-03-30 08:49:02

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

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

如果您需要支持不遵循 W3C 建议的旧版浏览器,通常在一个函数中,您将使用如下所示的内容:

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

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

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

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

从内联侦听器中,您可以传递事件对象,如:onclick="foo(event)",然后在函数中function foo(event){/* do stuff with event */}这适用于 IE 和 W3C 事件模型。
2021-03-28 08:49:02
“小于或等于八”有点……模棱两可。
2021-04-01 08:49:02
这实际上并没有回答这个问题。
2021-04-06 08:49:02
对不同问题的简洁回答。:-/
2021-04-07 08:49:02

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

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;
    }
}
它可能是“事件 || window.event”。
2021-03-14 08:49:02
如果 (e.cancelBubble) 对我来说不合适,如果它已经是真的,你将它设置为真
2021-03-14 08:49:02
e.cancelBubble在 IE 中返回 false!达不到e.cancelBubble = true;指令。改用 SoftwareARM 的条件!!
2021-03-25 08:49:02
为了让它工作,需要这样调用: <div onclick="myEventHandler(event);">
2021-04-04 08:49:02

使用此功能,它将测试是否存在正确的方法。

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;"
感谢@MSC,正是我所需要的!
2021-03-16 08:49:02
内联脚本。它确实回答了这个问题
2021-03-25 08:49:02