我让自己陷入了一个巨大而奇怪的境地。我使用VivaGraph JS在浏览器中绘制概念图。我正在使用的具体实现依赖于 SVG,因此我的主要图形 DOM 元素是一个 SVG。
在节点之间创建边缘的过程中,我使用Paper.JS编写了一小段代码,它使用 HTML5 中的画布。事实上,我侵入了vektor.js提供的源代码,并简单地将其更改为监听 CTRL+MouseDown 事件。
这两个元素,svg 图和画布,重叠并且具有完全相同的尺寸。该图有节点和边缘被操纵,它们监听鼠标和键盘事件,遗憾的是我的画布也是如此。
实际上,使用画布的原因是我想在鼠标移动期间绘制一条线(矢量或边缘或弧线),以便在我实际创建之前向用户显示正在创建的边缘是什么图中的边。
我无法使用 SVG 来做到这一点(是的,我知道,它应该是可行的),而 Paper.js 让我非常容易做到这一点。
遗憾的是,根据这些 DOM 元素的显示顺序,要么画布捕获事件,使图形无用,要么图形捕获所有事件,使画布无用。
有没有办法为两个 DOM 元素添加透明度?
图的事件监听器,内置在 VivaGraphJS 中,而 Paper Vertex 的事件监听器,内置在 Paper.JS 中
理想情况下,我希望将图表放在顶部,捕获事件,然后将它们传播回画布,以便绘制箭头。我觉得这应该是可行的,无论是通过纯 JavaScript,还是使用 jQuery。
到目前为止,图表中捕获的事件如下所示:
var graphics = Viva.Graph.View.svgGraphics();
/// some other stuff
graphics.node( function( node )
{
var ui = Viva.Graph.svg('g' ).attr('width', nodeSize )
.attr('height', nodeSize )
// Position the node, add its text, etc, etc...
$( ui ).mousedown( function( event )
{
event.preventDefault();
if ( event.ctrlKey )
{
if ( ctrl_mouse )
{
createEdge( ctrl_mouse, node.id );
ctrl_mouse = null;
// Remove the temporary arrow from canvas - the graph now has a permanent edge
}
else if ( !ctrl_mouse )
{
ctrl_mouse = node.id;
// Start drawing a temporary arrow on canvas
}
}
所有这些都发生在一个文件 graph.js 中。在另一个文件 edge.js 中,我设置了事件侦听器和绘制矢量的方式。我已将它添加到jsfiddle但遗憾的是它不会在那里运行(我猜键盘事件可能无法正确传播?)。
问题是 Paper.Js 有自己的事件监听器:
function onMouseDown( event )
function onKeyUp( event )
function onMouseMove(event)
显然,这些事件在纯 JavaScript 和 jQuery 中具有等价物,但我在 VivaGraphJS 或 jQuery 中捕获的事件不能传播到 PaperJS,因为它们是不同的对象。
那么,我能否以某种方式(最好使用纯 JavaScript,但 jQuery 也可以)模拟或将这些事件发送到 Paper.JS?