2

设想:

在浏览网页寻找 Javascript 自定义事件的解决方案时,我找不到任何实际示例,甚至 MDN 资源也非常有限。

我正在尝试重建paperjs 的 onMouseDrag 事件。我的预期用途是用于类似绘画的 Web 应用程序。

onMouseDrag 事件在以下情况下触发:

  • 鼠标左键按下
  • 鼠标在移动

目标:

这里的目标不是有一个工作onMouseDrag事件。目标是如何创建CustomEvent. 该onMouseDrag事件仅作为示例。

要求:

  1. 答案应该是vanilla-js或纯 js。(没有 jQuery 或任何其他库)
  2. 答案应该使用new CustomEvent()or new Event(),而不是任何不推荐使用的方法。
  3. 当 mousedrag 被调用时,传递的事件参数应该与mousemove 接收的事件参数相同。

代码:

我试过以下

var onMouseDrag = new CustomEvent('mousedrag'),
    elem = document.getElementById('element'),
    mousedown = false;

elem.addEventListener('mousedrag', function (event) {
    // The event argument passed should be 
    // the same event as the event passed by any other mouse event.

    // Do something while the mouse is being dragged.
});

elem.addEventListener('mousedown', function (event) {
    mousedown = true;
});

elem.addEventListener('mouseup', function (event) {
    mousedown = false;
});

elem.addEventListener('mousemove', function (event) {
    if (mousedown) {
        elem.dispatchEvent('mousedrag');
        // Pass the event variable to the dispatched mousedrag.
    }
});
4

2 回答 2

4

你几乎明白了,但你已经调度了你创建的原始事件,而不是字符串

var onMouseDrag = new CustomEvent('mousedrag'),
    elem = document.getElementById('element'),
    mousedown = false;

elem.addEventListener('mousedrag', function (event) {
    console.log(event)
});

elem.addEventListener('mousedown', function (event) {
    mousedown = true;
});

elem.addEventListener('mouseup', function (event) {
    mousedown = false;
});

elem.addEventListener('mousemove', function (event) {
    if (mousedown) 
        elem.dispatchEvent(onMouseDrag);
});

编辑:

看来您可以只向事件对象添加属性

var onMouseDrag = new CustomEvent('mousedrag'),
    elem = document.getElementById('element'),
    mousedown = false;

elem.addEventListener('mousedrag', function (event) {
    var div = document.createElement('div');
    div.className = 'point';
    div.style.top = (event.clientY-71) + 'px';
    div.style.left = (event.clientX-41) + 'px';
    elem.appendChild(div);
});

elem.addEventListener('mousedown', function (event) {
    mousedown = true;
});

elem.addEventListener('mouseup', function (event) {
    mousedown = false;
});

elem.addEventListener('mousemove', function (event) {
    if (mousedown)  {
        onMouseDrag.clientX = event.clientX;
        onMouseDrag.clientY = event.clientY;
        elem.dispatchEvent(onMouseDrag);
    }
});

小提琴

于 2014-02-01T23:55:23.133 回答
2

要向事件对象添加更多数据,存在 CustomEvent 接口,并且可以使用 detail 属性来传递自定义数据。例如,可以按如下方式创建事件:

const event = new CustomEvent('build', { detail: elem.dataset.time }); 这将允许您访问事件侦听器中的其他数据:

function eventHandler(e) {
  console.log('The time is: ' + e.detail);
}
于 2020-11-22T17:39:24.760 回答