css 使较高的z索引元素禁用较低元素的onclick

8yoxcaq7  于 2023-07-01  发布在  其他
关注(0)|答案(5)|浏览(101)

我有一个'层',我想给予一个onclick。诀窍是,我希望上面层的元素在单击时不执行该操作。
我怎样才能让这一切发生?

gywdnpxw

gywdnpxw1#

您遇到的问题是由事件通过DOM树向上传播的方式引起的。当您单击页面上的某个元素时,该元素的单击处理程序将有机会响应单击。除非处理程序停止事件传播,否则父元素将有机会处理事件,依此类推,直到到达根元素。
这种行为通常感觉很自然,被单击元素“后面”的每个元素都将有机会响应事件。但是,当你使用绝对定位时,你可以将一个元素放在另一个元素的前面,而这个元素在dom树中不是它的祖先。此时,事件传播可能会令人困惑。只有被单击的元素祖先接收click事件,这意味着它后面的元素可能不会接收。
我创建了一个jsfiddle -http://jsfiddle.net/HUGNd/-来说明这种情况。
一种快速解决方法是确保要响应click事件的元素是被单击元素的祖先。否则,无论调用哪个元素的事件处理程序,您都可能在JavaScript中获得所需的结果。

taor4pac

taor4pac2#

调用event.stopPropagation()来防止“冒泡”。或者,如上所述,更改绝对定位元素的父元素关系。

zi8p0yeb

zi8p0yeb3#

我有点困惑,我认为这会通过浏览器自然发生。据我所知,你正试图做这样的事情:

<html>
  <body>
    <div id="block" style="position:absolute; top:0; left:0; width:200px; height:200px; background-color:red;" onclick="alert('clicked');"></div>
    <div id="block" style="position:absolute; top:0; left:0; width:100px; height:100px; background-color:blue;"></div>
  </body>
</html>

[Not真的是一个答案,但考虑到我想发布代码,我觉得评论是不合适的]

bq8i3lrv

bq8i3lrv4#

您可以将事件触发器减少到所需的目标。

targetDiv.onclick = (e) => {
            if ((e.target) == targetDiv) {
              alert('correct target');
            }
        }
kqqjbcuj

kqqjbcuj5#

您可以使用以下CSS属性来取消该元素上的所有指针事件:

.element {
    pointer-events: none;
}

该属性将禁用该元素上的所有事件,如悬停、单击、聚焦等

相关问题