我有一个具有背景的div:透明,以及边框。在这个div下面,我有更多的元素。

目前,当我在覆盖div外部单击时,我可以单击底层元素。但是,当我直接单击覆盖div时,我无法单击底层元素。

我希望能够单击这个div,以便单击底层元素。


当前回答

我不能总是使用指针事件:在我的场景中没有,因为我希望覆盖层和底层元素都可以单击/选择。

DOM结构如下所示:

<div id="outerElement">
   <div id="canvas-wrapper">
      <canvas id="overlay"></canvas>
   </div>
   <!-- Omitted: element(s) behind canvas that should still be selectable -->
</div>

(outerElement、canvas wrapper和canvas元素具有相同的大小。)

为了使画布后面的元素正常工作(例如,可选择、可编辑),我使用了以下代码:

canvasWrapper.style.pointerEvents = 'none';

outerElement.addEventListener('mousedown', event => {
    const clickedOnElementInCanvas = yourCheck // TODO: check if the event *would* click a canvas element.
    if (!clickedOnElementInCanvas) {

        // if necessary, add logic to deselect your canvas elements ...

        wrapper.style.pointerEvents = 'none';
        return true;
    }

    // Check if we emitted the event ourselves (avoid endless loop)
    if (event.isTrusted) {
        // Manually forward element to the canvas
        const mouseEvent = new MouseEvent(event.type, event);
        canvas.dispatchEvent(mouseEvent);
        mouseEvent.stopPropagation();
    }
    return true;
});

一些画布对象还带有输入字段,因此我也必须允许键盘事件。为此,我必须根据画布输入字段当前是否聚焦来更新pointerEvents属性:

onCanvasModified(canvas, () => {
    const inputFieldInCanvasActive = // TODO: Check if an input field of the canvas is active.
    wrapper.style.pointerEvents = inputFieldInCanvasActive  ? 'auto' : 'none';
});

其他回答

是的,可以强制重叠层通过(忽略)单击事件。此外,你可以让特定的孩子被排除在这种行为之外。。。

可以使用指针事件执行此操作

指针事件影响对点击、轻击、滚动和悬停事件的反应。


在应该忽略/通过您设置的所述事件的层中

pointer-events: none; 

需要再次响应鼠标/轻敲事件的无响应层的子级需要:

pointer-events: auto; 

如果您使用多个重叠的div层(可能有些父层是透明的),那么第二部分非常有用,您需要能够单击子元素,并且仅单击该子元素。

示例用法:

.父级{指针事件:无;}.儿童{指针事件:自动;}<div class=“parent”><a href=“#”>我没有反应</a><a href=“#”class=“child”>我又可以点击了,哇</a></div>

例如,只需在所有HTML摘录周围包装一个标记

<a href="/categories/1">
  <img alt="test1" class="img-responsive" src="/assets/photo.jpg" />
  <div class="caption bg-orange">
    <h2>
      test1
    </h2>
  </div>
</a>

在我的示例中,我的字幕类具有悬停效果,指针事件为:无;你只会输

包装内容将保持悬停效果,您可以单击所有图片,包括div,问候!

允许用户通过div单击底层元素取决于浏览器。所有现代浏览器,包括Firefox、Chrome、Safari和Opera,都能理解指针事件:没有。

对于IE,这取决于背景。如果背景是透明的,则无需执行任何操作即可进行点击。另一方面,对于像背景这样的东西:白色;不透明度:0;过滤器:Alpha(不透明度=0);,IE需要手动事件转发。

请参阅JSFiddle测试和CanIUse指针事件。

我需要这样做,并决定走这条路:

$('.overlay').click(function(e){
    var left = $(window).scrollLeft();
    var top = $(window).scrollTop();

    //hide the overlay for now so the document can find the underlying elements
    $(this).css('display','none');
    //use the current scroll position to deduct from the click position
    $(document.elementFromPoint(e.pageX-left, e.pageY-top)).click();
    //show the overlay again
    $(this).css('display','block');
});

我加上这个答案是因为我没有看到它的全部内容。我能够使用elementFromPoint完成这一操作。所以基本上:

将单击附加到要单击的div把它藏起来确定指针所在的元素单击元素。

var range-selector= $("")
    .css("position", "absolute").addClass("range-selector")
    .appendTo("")
    .click(function(e) {
        _range-selector.hide();

        $(document.elementFromPoint(e.clientX,e.clientY)).trigger("click");
    });

在我的例子中,重叠的div是绝对定位的——我不确定这是否会产生差异。这至少适用于IE8/9、Safari Chrome和Firefox。