CSS伪元素上的事件监听器,例如:: after和:: before?

jen*_*irf 37 javascript css pseudo-element

我有一个div带有CSS伪元素的元素::before用作关闭按钮(而不是使用实际按钮).我该如何申请一个事件监听器伪元素?

HTML

<div id="box"></div>
Run Code Online (Sandbox Code Playgroud)

CSS

#box:before
{
 background-image: url(close.png);
 content: '';
 display: block; 
 height: 20px;
 position: absolute;
 top: -10px;
 right: -10px; 
 width: 20px;
}

#box
{
 height: 100px;
 width: 100px;
}
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 35

不可以.在DOM中不存在伪元素,因此它没有HTMLElementNode表示它的对象.

  • 具有事件绑定方法的[class](http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-58190037)的实例在上面. (5认同)
  • @derek这个答案仍然是真的 - 你不能将事件分配给一个伪元素.声明指针事件是一个很好的解决方法,但只有在div#box本身或div#box中的其他子元素不需要其他事件监听器的情况下. (4认同)

p.b*_*iko 31

正在寻找解决方案,并找到了这个线程.现在想分享我的解决方案:

CSS

element { pointer-events: none; }
element::after { pointer-events: all; }
Run Code Online (Sandbox Code Playgroud)

JS

element.addEventListener('click', function() { ... });
Run Code Online (Sandbox Code Playgroud)

如果您不需要任何指针事件,则此方法有效element.检查它的实际效果.

  • 这应该是公认的解决方案。不过,指针事件有两个问题:1)阻止容器元素保存其他事件侦听器(您可能无论如何都不想要);2)更重要的是,指针事件级联,因此您必须允许它返回到需要交互的所有其他内容上。 (3认同)

Ben*_*tal 13

在jQuery中没有:before和:after选择器.但是,作为替代方法,您可以检查click事件的位置并检查它是否在您的伪元素上:

(我没有测试过这个)

样式:

#mything {
    width: 100px;
    height: 100px;
    position: relative;
    background: blue;
}
#mything:after {
    content: "x";
    font-size: 10px;
    position: absolute;
    top: 0;
    right: 0;
    background: red;
    width: 10px;
    height: 10px;
}
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$('#mything').click(function(e) {
    if (e.clientX > $(this).offset().left + 90 &&
        e.clientY < $(this).offset().top + 10) {
        // do something
    }
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<div id="mything">Foo</div>
Run Code Online (Sandbox Code Playgroud)