Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中抛出mouseEvent?_Javascript_D3.js_Dom_Svg_Dom Events - Fatal编程技术网

如何在Javascript中抛出mouseEvent?

如何在Javascript中抛出mouseEvent?,javascript,d3.js,dom,svg,dom-events,Javascript,D3.js,Dom,Svg,Dom Events,我有一个带有重叠元素的SVG,绝对定位。元素包含在使用SVG g标记的层中,因此可能并不总是有一个公共父元素 在D3中,元素可以响应它们捕获的点击事件。但是,重叠元素会阻止底部元素捕捉任何单击事件。由于我的应用程序的设计,我不能随意更改它们的DOM顺序——这很重要。我想知道是否有一种方法可以在保留拖动事件的同时通过元素传递单击事件——如果可能的话,就像抛出事件一样 由于我仍然需要拖动事件和其他指针事件,所以我不能使用pointer-events:none属性。此外,由于这些元素可能没有一个共同的

我有一个带有重叠元素的SVG,绝对定位。元素包含在使用SVG g标记的层中,因此可能并不总是有一个公共父元素

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

由于我仍然需要拖动事件和其他指针事件,所以我不能使用pointer-events:none属性。此外,由于这些元素可能没有一个共同的祖先,所以我不能以那种方式循环元素

我想要的行为是切换-单击形状将调用形状的单击处理程序,并选择该形状。如果选定形状与另一形状重叠,则单击该形状将调用选定形状的单击处理程序,该处理程序将抛出单击事件,使其传递到基础元素。也许可以使用类似d3.event.throw或者返回d3.event之类的方法,或者类似的想法


这可能吗?

单击事件由元素的单击事件处理程序处理。所以,您要做的一切就是调用底层元素的click事件处理程序。但是,如果还想将覆盖元素的单击坐标传递给基础元素的单击事件处理程序,则必须传递坐标/it事件证据:

overlyingElement.onclick=function(e){
    var event=e||window.event;
    underlyingElement.click(event);
}
从未测试过,但


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

这是否意味着您要在单击时选择此元素下的所有元素?我不知道你为什么要这么做,但这就是你想要的:

基本思想是:

接收mouseevent 在当前元素上临时设置显示:无。 使用document.elementFromPoint(在中工作)和WebKit确定当前元素下的元素。 将“显示”设置回元素上的显示。 在它下面的元素上。 通过设置事件标志或其他全局标志,确保这不会导致无限循环。 这适用于一个深度级别,因为elementFromPoint将在第二个元素尝试执行相同操作后返回顶层元素。如果您想深入元素堆栈,那么实际上可以在所有较低的元素都通过在您转发的事件上设置的回调或某些其他全局机制接收到事件之后,将display属性设置回原来的位置