При использовании d3, как вызвать перетаскивание только с помощью событий мыши?

#javascript #typescript #d3.js #frontend

#javascript #typescript #d3.js #интерфейс

Вопрос:

Есть несколько дискуссий о программном запуске перетаскивания d3. Обычно люди предлагают обходной путь. Например, сохраните функцию перетаскивания и запустите ее напрямую. Итак, есть ли способ вызвать перетаскивание d3 с помощью событий мыши? Перетаскивание d3 должно быть реализовано в соответствии с событиями мыши. В моем приложении существуют сложные настройки перетаскивания, и использование обработчиков перетаскивания невозможно. Кроме того, я надеюсь, что код тестируется только на границах вместо того, чтобы открывать его.

Мне интересно, как d3 реализовал перетаскивание. Я пытался отправлять события mousedown и mousemove, но это не работает. Вот мой тестовый код.

     const circles = document.querySelectorAll('.edit-handler');
    const clientRect = circles[0].getBoundingClientRect();
    const clientX = (clientRect.left   clientRect.right) / 2;
    const clientY = (clientRect.top   clientRect.bottom) / 2;
    circles[0].dispatchEvent(
        new MouseEvent('mousedown', {clientX, clientY, buttons: 1}));
    circles[0].dispatchEvent(
        new MouseEvent('mousemove', {clientX, clientY, buttons: 1}));
    circles[0].dispatchEvent(new MouseEvent(
        'mousemove',
        {clientX: clientX   100, clientY: clientY   100, buttons: 1}));
  

Ответ №1:

Хорошо, я понял это

Похоже, что view: window является прерывателем сделки. Я не совсем понимаю важность, но это работает. Если вы знаете, почему, пожалуйста, оставьте комментарии, чтобы сообщить мне и другим.

     const circles = document.querySelectorAll('.edit-handler');
    const clientRect = circles[0].getBoundingClientRect();
    const clientX = (clientRect.left   clientRect.right) / 2;
    const clientY = (clientRect.top   clientRect.bottom) / 2;
    circles[0].dispatchEvent(new MouseEvent('mousedown', {
      clientX,
      clientY,
      view: window, // After adding this, it works.
    }));
    circles[0].dispatchEvent(new MouseEvent('mousemove', {
      clientX,
      clientY,
    }));
    circles[0].dispatchEvent(new MouseEvent('mousemove', {
      clientX: clientX   100,
      clientY: clientY   100,
    }));
    circles[0].dispatchEvent(new MouseEvent('mouseup', {
      clientX: clientX   100,
      clientY: clientY   100,
      view: window, // Here too
    }));