javascript - 如何在 Paper.JS 中手动发送事件?

标签 javascript paperjs

我想要实现的是当我点击它并在不释放鼠标的情况下拖动克隆时在 Canvas 上克隆一个项目。

             menuItem.onMouseDown = function(event){
                var clone = this.clone();
                clone.onMouseDrag = function(event){
                    this.position+=event.delta;
                    console.log(event);
                }
                var ev = new MouseEvent('mousedrag',
                            event.event);
                ev.event.type="mousemove";
                ev.delta={x:0,y:0};
                ev.target=clone;
                ev.point=event.point;
                clone.emit('mousedrag',ev);
            };

我试过了,我相信我需要这样的东西。因此,当我单击 menuItem 时,我会克隆它,并为克隆设置事件,然后在其上发出 一个事件。但是需要设置发出的事件,这就是我的想法失败的地方。对这个有什么想法吗?

最佳答案

我会做一些不同的事情;我不会尝试在选择/拖动过程中交换处理程序,而只是在逻辑上暂时交换项目:

menuItem = new Path.Circle(view.bounds.center, 25);
menuItem.fillColor = 'red';

var oldMenuItem = null;

menuItem.onMouseDown = function(e) {
    oldMenuItem = this.clone();
    oldMenuItem.fillColor = 'green';
}

menuItem.onMouseDrag = function(e) {
    this.position += e.delta;
}

menuItem.onMouseUp = function(e) {
    // swap menuItem and oldMenuItem to keep mouse handling on the
    // original item?
    var t = this.position;
    this.position = oldMenuItem.position;
    oldMenuItem.position = t;
}

这是一个 sketch它实现了与您正在寻找的东西类似的东西(我认为)。假设红色圆圈是菜单项。

可以构建 ToolEvent 或 MouseEvent(取决于处理程序),但目前尚未记录,需要访问 github 上的源代码。编辑:我很好奇并访问了 github。

MouseEvent 构造函数代码在事件目录中,但使用构造函数并从 CanvasView.js 调用 .emit 函数模块(搜索 new MouseEvent)。但是为了模拟你想要的东西,你需要模拟整个事件链,以保持内部状态的一致性。因此,您需要 1) 在原始项目上发出 mouseup 事件,2) 在新项目上发出 mousedown,以及 3) 在新项目上发出 mousemoves,以及 3) 从原始项目分离处理程序并附加一个处理程序到 1 和 2 之间的新项目。(如果您之前分离处理程序,则可能不需要发出原始的 mouseup。)如果您已经创建了一个 Tool,您将需要创建一个 ToolEvent 而不是 MouseEvent

无论如何,我明白为什么它没有记录在案 - 有很多需要记住的地方。我想更新此答案以反射(reflect)您的原始问题,尽管答案仍然是最好找到另一种方法来执行此操作。

如果有人真的想要或需要这样做:

  1. 鼠标事件是通过 MouseEvent.js 中的代码构建的
  2. CanvasView.js 中使用构造函数并发出事件
  3. 事件处理由 View.js 驱动
  4. 工具事件是通过 ToolEvent.js 中的代码构建的

OTOH,发出帧事件很容易:

view.emit('frame', {});

关于javascript - 如何在 Paper.JS 中手动发送事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539349/

相关文章:

javascript - 为什么这个nodejs代码无论哪个函数在先都会以相同的顺序输出?

jquery - 将文本拖动到 PaperJS Canvas 上

javascript - 在 paper.js 中沿贝塞尔曲线绘制文本

javascript - Paper.js 中动态生成的可移动矢量形状

javascript - 外部脚本在 PaperJS v0.9.22 中不起作用

javascript - Rails3中动态更新html页面

javascript - 我可以加密内容,使其不会出现在查看源代码中,然后显示在页面加载上吗?

javascript - Paperjs : Canvas height and width gets changed on window resize. 如何防止更改?

javascript - 带有 id 的 html 元素是否已经在 J​​avaScript 中定义?

javascript - 使用电子邮件和密码登录后,我需要将电子邮件传递到下一个页面,以便从 API 检索用户数据。 ( react )