我有一个SVG,其中的元素重叠,位置绝对正确。元素包含在图层中(使用SVG g
)标签,因此可能并不总是具有公共父元素。
在D3中,元素可以响应其捕获的点击事件。但是,重叠元素会阻止底部元素捕获任何单击事件。 (由于我的应用程序的设计,我不能任意更改其DOM顺序-这很重要。)我想知道是否有一种方法可以在保留拖动事件的同时通过元素传递click事件-几乎就像“ throwing “该事件,如果可能的话。
由于我仍然需要拖动事件和其他指针事件,因此不能使用“ pointer-events:none”属性。此外,由于这些元素可能没有共同的祖先,因此我无法真正以这种方式遍历元素。
我想要的行为是切换-单击形状会调用该形状的点击处理程序,然后选择该形状。单击选定形状(如果它与另一个形状重叠)将调用选定形状的单击处理程序,该处理程序将“引发” click事件,以便其传递到基础元素。 (也许使用诸如d3.event.throw
之类的东西,或诸如return d3.event
之类的想法)。
这可能吗?
click事件由元素的click事件处理程序处理。因此,您要做的所有事情就是调用底层元素的click事件处理程序。但是,如果您还想将上层元素的点击坐标传递给基础元素的click事件处理程序,则必须传递它们(坐标)/它(事件)证据:
overlyingElement.onclick=function(e){
var event=e||window.event;
underlyingElement.click(event);
}
未经测试,但
我希望它也可以在IE中正常工作。
这是否意味着您要select单击该元素下的所有元素?我不确定为什么要这样做,但是这就是您要寻找的:http://www.vinylfox.com/forwarding-mouse-events-through-layers/
基本思想是:
mouseevent
display: none
。document.elementFromPoint
确定哪个元素位于当前元素之下,现在也可以在Firefox,IE和WebKit中使用。display
设置回到元素上的状态。dispatch
the event在它下面的元素上。这适用于一个深度级别,因为dispatch
将在第二个元素尝试执行相同操作后返回顶级元素。如果您想深入元素堆栈,则可以在所有较低的元素都通过转发的elementFromPoint
上设置的callbacks
display
属性实际设置回去。