【问题标题】:How can I get 3 divs overlayed to allow click-through that fires all underlying div's event handlers?如何获得 3 个 div 叠加层以允许点击触发所有底层 div 事件处理程序?
【发布时间】:2015-01-23 18:25:15
【问题描述】:

我有 3 个 div 像这样叠加:

<div id="div1" style="height: 500px; width: 500px; position:absolute; z-index: 1"></div>
<div id="div2" style="height: 500px; width: 500px; position:absolute; z-index: 2"></div>
<div id="div3" style="height: 500px; width: 500px; position:absolute; z-index: 3"></div>

它们都有 on.click 事件处理程序,会弹出不同的消息

是否有可能在单击一个时,无论哪个在顶部,它都允许所有通过单击(尝试“指针事件:无”但禁用所有功能)的底层 div 触发其各自的事件处理程序?假设我点击了 div 3 并且 div 2 和 3 也触发了它们的事件处理程序。另外,我不想要像这样的硬编码解决方案:

$('#div3').on('click',function() {
   // trigger div 1 and 2 events manually
})

指针事件的问题:没有人拥有它,不会像我想要的那样触发它的事件处理程序,有什么方法可以解决这个问题?

【问题讨论】:

  • 为什么不为所有三个 div 使用一个类并使用该类点击事件?
  • 据我了解,使用pointer events 不是一个好主意,因为它没有很好的支持。我认为使用 jquery 的硬编码解决方案将是可行的方法
  • 类硬编码的问题在于,有时底层 div 的大小与顶部的大小不同,并且硬编码类事件处理程序将触发所有底层元素,即使鼠标没有t 正好在各种尺寸的底层之上。

标签: jquery html css events click-through


【解决方案1】:

我不确定这个解决方案是否对您来说过于“硬编码”,但它会检测到前面元素后面的任何元素并触发它们的点击处理程序(如果鼠标点击也位于该元素上方)

$('#div3').click(function(e) {
$(this).hide();
var elements = [];
var element;
var count = 0;
element = $(document.elementFromPoint(e.clientX,e.clientY));
while (element.prop("tagName") != "HTML" && count < 15) {
    elements.push(element);
    $(element).hide();
    element = $(document.elementFromPoint(e.clientX,e.clientY));
    count++;
}
$(elements).each(function() {
    $(this).trigger("click");
    $(this).show();
});
$(this).show();
});

小提琴:http://jsfiddle.net/13jLrarp/3/

count 用于确保它不会陷入无限循环(以防万一),尽管技术上不需要

在fiddle中,点击绿色框会使红色框水平增长,点击蓝色框会使红色框垂直增长。单击它们重叠的地方会使红色框双向增长。请注意,使用 z-index 将红色框放置在其他两个之上

【讨论】:

  • 这正是我想要的!太感谢了。有趣的是,大约一周前,在谷歌搜索这个问题数小时后,我发现了与此类似的代码,但那时我并不急于使用它。现在的问题是再次找到它,但谷歌搜索这样的东西并不容易,最后我最终来到了这里,非常感谢!
【解决方案2】:
    $( "#other" ).click(function() {
      $( "#target" ).click();
    });

来源: http://api.jquery.com/click/

【讨论】:

  • 你错过了 OP 说没有像你刚刚发布的那样硬编码的解决方案的部分
  • 你会得到很多反对票,你现在最好解释一下自己:)
  • 问题是上面那个可能是 500px x 500px 大,下面那个是 50px x 50px,如果我点击一个显示顶部但下面那个不是的区域t 然后底层 div 会调用它的 click 事件,即使光标不在它上面。
  • @Sam Battat 和@Joe Sager:你们是对的,完全错过了这一点。那将是我的错误:) 所以我想更好的选择是用父级包装三个 div,然后监听任何子级的点击事件,然后触发特定类型的所有其他子级的点击事件(使用属性或类)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多