提问人:Sam 提问时间:12/23/2008 最后编辑:Michał PerłakowskiSam 更新时间:4/7/2023 访问量:552198
如何使用内联 onclick 属性停止事件传播?
How to stop event propagation with inline onclick attribute?
问:
请考虑以下几点:
<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
答:
<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>
评论
event
似乎在IOS Safari的内联事件中也可用。
根据此页面,在IE中,您需要:
event.cancelBubble = 真
请记住,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;
}
}
评论
<div onclick="myEventHandler(event);">
e.cancelBubble
在 IE 中返回 false!它无法到达指令。请改用 SoftwareARM 的条件!!e.cancelBubble = true;
有两种方法可以从函数内部获取事件对象:
- 第一个参数,在兼容 W3C 的浏览器(Chrome、Firefox、Safari、IE9+)中
- 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 */}
使用此函数,它将测试是否存在正确的方法。
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;"
评论
这也有效 - 在链接 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;
}
};
评论
confirm
对于 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
}
这对我有用
<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>
评论
<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>
为什么不直接检查点击了哪个元素?如果单击某些内容,则将其分配给被单击的元素,并且单击的元素也可以作为参数传递。window.event.target
如果目标和元素不相等,则这是一个向上传播的事件。
function myfunc(el){
if (window.event.target === el){
// perform action
}
}
<div onclick="myfunc(this)" />
评论
由于业力,我无法发表评论,所以我把这个写成完整的答案:根据 Gareth 的回答 (var e = arguments[0] || window.event;[...])我在 onclick 上内联使用了这个 oneliner 进行快速破解:
<div onclick="(arguments[0] || window.event).stopPropagation();">..</div>
我知道已经晚了,但我想让你知道这在一行中有效。大括号返回一个事件,该事件在两种情况下都附加了 stopPropagation-function,因此我尝试将它们封装在大括号中,就像在 if 和 ....它有效。:)
最好的解决方案是通过 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>
使用单独的处理程序,例如:
function myOnClickHandler(th){
//say let t=$(th)
}
在 HTML 中,这样做:
<...onclick="myOnClickHandler(this); event.stopPropagation();"...>
甚至:
function myOnClickHandler(e){
e.stopPropagation();
}
为:
<...onclick="myOnClickHandler(event)"...>
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也会这样做,所以我甚至没有测试它!
脚本
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>
评论