如何在Java中“抛出” mouseEvent?

问题描述 投票:1回答:2

我有一个SVG,其中的元素重叠,位置绝对正确。元素包含在图层中(使用SVG g)标签,因此可能并不总是具有公共父元素。

在D3中,元素可以响应其捕获的点击事件。但是,重叠元素会阻止底部元素捕获任何单击事件。 (由于我的应用程序的设计,我不能任意更改其DOM顺序-这很重要。)我想知道是否有一种方法可以在保留拖动事件的同时通过元素传递click事件-几乎就像“ throwing “该事件,如果可能的话。

由于我仍然需要拖动事件和其他指针事件,因此不能使用“ pointer-events:none”属性。此外,由于这些元素可能没有共同的祖先,因此我无法真正以这种方式遍历元素。

我想要的行为是切换-单击形状会调用该形状的点击处理程序,然后选择该形状。单击选定形状(如果它与另一个形状重叠)将调用选定形状的单击处理程序,该处理程序将“引发” click事件,以便其传递到基础元素。 (也许使用诸如d3.event.throw之类的东西,或诸如return d3.event之类的想法)。

这可能吗?

javascript d3.js dom svg dom-events
2个回答
0
投票

click事件由元素的click事件处理程序处理。因此,您要做的所有事情就是调用底层元素的click事件处理程序。但是,如果您还想将上层元素的点击坐标传递给基础元素的click事件处理程序,则必须传递它们(坐标)/它(事件)证据:

overlyingElement.onclick=function(e){
    var event=e||window.event;
    underlyingElement.click(event);
}

未经测试,但

我希望它也可以在IE中正常工作。


0
投票

这是否意味着您要select单击该元素下的所有元素?我不确定为什么要这样做,但是这就是您要寻找的:http://www.vinylfox.com/forwarding-mouse-events-through-layers/

基本思想是:

  1. 接收mouseevent
  2. 暂时在当前元素上设置display: none
  3. [使用document.elementFromPoint确定哪个元素位于当前元素之下,现在也可以在FirefoxIE和WebKit中使用。
  4. display设置回到元素上的状态。
  5. dispatch the event在它下面的元素上。
  6. 通过在事件上设置标志或其他全局标志,确保不会导致无限循环。>>
  7. 这适用于一个深度级别,因为dispatch将在第二个元素尝试执行相同操作后返回顶级元素。如果您想深入元素堆栈,则可以在所有较低的元素都通过转发的elementFromPoint上设置的callbacks

或其他全局机制接收到事件之后,将display属性实际设置回去。
© www.soinside.com 2019 - 2024. All rights reserved.