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

How to stop event propagation with inline onclick attribute?

提问人:Sam 提问时间:12/23/2008 最后编辑:Michał PerłakowskiSam 更新时间:4/7/2023 访问量:552198

问:

请考虑以下几点:

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

如何使用户单击跨度时不会触发 的 click 事件?div

JavaScript HTML 事件 DOM

评论


答:

365赞 James 12/23/2008 #1

使用 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>

评论

12赞 Robert C. Barth 12/23/2008
FireFox 中没有事件对象这样的东西。
6赞 Vincent Robert 12/23/2008
事件对象是回调的参数。实际上,IE中没有事件对象这样的东西,因为这个对象可以通过window.event访问,而不是函数的参数:-)
72赞 Benubird 12/10/2010
这是错误的 - 内联 onclick 处理程序不会将事件作为参数传递。正确的解决方案是下面的 Gareths。
2赞 Morgan Cheng 5/19/2011
在 Firefox 中,您可以访问内联脚本中的变量事件,但 window.event 不可用。<div onclick=“alert(event);”></分区>
1赞 Yuval A. 2/3/2015
event似乎在IOS Safari的内联事件中也可用。
7赞 ajh1138 12/23/2008 #2

根据此页面,在IE中,您需要:

event.cancelBubble = 真

86赞 Robert C. Barth 12/23/2008 #3

请记住,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;
    }
}

评论

13赞 DarkDust 12/22/2010
为了使它工作,需要这样称呼它:<div onclick="myEventHandler(event);">
1赞 Pointy 6/23/2011
它可以是“事件 ||window.event”。
1赞 Guillaume86 10/6/2011
如果 (e.cancelBubble) 在我看来不合适,如果它已经为 true,则将其设置为 true
0赞 mauretto 3/30/2012
e.cancelBubble在 IE 中返回 false!它无法到达指令。请改用 SoftwareARM 的条件!!e.cancelBubble = true;
223赞 Gareth 12/23/2008 #4

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

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

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

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

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

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

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

评论

13赞 RobG 12/26/2014
从内联侦听器中,您可以传递事件对象,例如: ,然后在函数中。这适用于 IE 和 W3C 事件模型。onclick="foo(event)"function foo(event){/* do stuff with event */}
6赞 Niki Romagnoli 12/1/2016
“小于或等于八”在某种程度上是......模糊。
8赞 jcomeau_ictx 6/19/2017
这实际上并没有回答这个问题。
1赞 Arel 10/29/2018
对另一个问题的简洁回答。:-/
47赞 SoftwareARM 2/25/2011 #5

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

function disabledEventPropagation(event)
{
   if (event.stopPropagation){
       event.stopPropagation();
   }
   else if(window.event){
      window.event.cancelBubble=true;
   }
}
22赞 MSC 5/25/2012 #6

我遇到了同样的问题 - IE 中的 js 错误框 - 据我所知,这在所有浏览器中都工作正常(event.cancelBubble=true 在 IE 中完成这项工作)

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

评论

1赞 DannyC 7/17/2015
感谢@MSC正是我需要的!
1赞 Cesar 7/19/2017
内联脚本。它确实回答了这个问题
1赞 Rajendra 6/6/2013 #7

这也有效 - 在链接 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;
    }
};

评论

2赞 jzonthemtn 9/27/2013
这不是问题的意思。
0赞 gion_13 10/2/2013
@jbird 这正是问题的意思。这是一种不同的(旧)方法来取消事件,使其不冒泡 dom 树(它在 dom api 级别 1 规范中)。
0赞 jzonthemtn 10/3/2013
@gion_13 但点击的操作不是用户需要确认的。在问题中,我们只希望孩子的 onclick() 触发,而不是父母的 onclick()。在这些之间放置用户提示是没有帮助的。我希望你能看到这种差异。
1赞 gion_13 10/3/2013
这无关紧要。我指的是返回值。quote:在链接 HTML 中使用 onclick 并像这样返回confirm
0赞 commonpike 1/4/2016
在链接后返回 false 取消,它不会取消在我的 chrome 上的传播
10赞 Evgeny Gorb 7/1/2013 #8

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

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

或者,将 event 作为参数传递给内部函数:

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

在 someFunction 中:

function someFunction(event){
    event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used
    // other onclick logic
}
14赞 Matias Contreras 8/13/2014 #9

这对我有用

<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>

评论

0赞 Nicole 11/21/2018
您确定此确切的代码片段适合您吗?因为看起来在外部 div 的 onclick 处理程序中存在字符串引用问题......?!
1赞 commonpike 1/4/2016 #10
<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>
3赞 cs01 11/1/2016 #11

为什么不直接检查点击了哪个元素?如果单击某些内容,则将其分配给被单击的元素,并且单击的元素也可以作为参数传递。window.event.target

如果目标和元素不相等,则这是一个向上传播的事件。

function myfunc(el){
  if (window.event.target === el){
      // perform action
  }
}
<div onclick="myfunc(this)" />

评论

0赞 Simon Mattes 4/26/2017
谢谢伙计,这似乎是这里最干净的解决方案。不过,您必须考虑的是,只有当单击的元素是实际最顶层的元素时,这才匹配。
10赞 user3611941 10/23/2019 #12

由于业力,我无法发表评论,所以我把这个写成完整的答案:根据 Gareth 的回答 (var e = arguments[0] || window.event;[...])我在 onclick 上内联使用了这个 oneliner 进行快速破解:

<div onclick="(arguments[0] || window.event).stopPropagation();">..</div>

我知道已经晚了,但我想让你知道这在一行中有效。大括号返回一个事件,该事件在两种情况下都附加了 stopPropagation-function,因此我尝试将它们封装在大括号中,就像在 if 和 ....它有效。:)

0赞 jose.serapicos 2/23/2020 #13

最好的解决方案是通过 javascript 函数处理事件,但为了直接使用 html 元素使用简单快速的解决方案,一旦“event”和“window.event”被弃用并且不普遍支持(https://developer.mozilla.org/en-US/docs/Web/API/Window/event),我建议以下“硬代码”:

<div onclick="alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>
6赞 CodeToLife 12/7/2020 #14

使用单独的处理程序,例如:

function myOnClickHandler(th){
//say let t=$(th)
}

在 HTML 中,这样做:

<...onclick="myOnClickHandler(this); event.stopPropagation();"...>

甚至:

function myOnClickHandler(e){
  e.stopPropagation();
}

为:

<...onclick="myOnClickHandler(event)"...>
2赞 Lodewijk 8/1/2022 #15
Event.preventDefault()

是当前的常态,也是对我有用的一件事。请参见:https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault

    <button value=login onclick="login(event)">login</button>

//and in a script tag
function login(ev){
    ev.preventDefault()
    
    return false;
}

这在最新的 Chrome、Opera 和 IE 中有效。(Mozilla页面表明Firefox也会这样做,所以我甚至没有测试它!

1赞 Caio Agiani 4/7/2023 #16

脚本

function handleTeste(e) {
  const event = e || window.event;

  event.preventDefault();
  event.stopPropagation();

  console.log("Clicked");
}

[HTML全文]

<div class="favorite" onclick="handleTeste(event)">
  <i class="fa-duotone fa-heart fs-2 text-hover-gray-800 text-primary"></i>
</div>