Как передать все события мыши через абсолютно позиционированный элемент?

pointer-events это не решение

Я пытаюсь расположить компоненты React (например, hover=tooltip, dblclick=toolbar) поверх редактора ProseMirror.

Удобный метод, который я нашел, состоит в том, чтобы создавать виджеты, абсолютно позиционируемые над соответствующим содержимым. Проблема, которую я имею, состоит в том, что выбор текста отбрасывается этим подходом.

https://jsfiddle.net/8w5x7e1s/145/

var a = document.querySelector('#a');
var b = document.querySelector('#b');

a.addEventListener('mousedown', evt => {
    a.style.display = 'none';

const { clientX, clientY } = evt;
  const target = document.elementFromPoint(clientX, clientY);
  const newEvt = new MouseEvent(evt.type, evt);
  target.dispatchEvent(newEvt);

  setTimeout(() => (a.style.display = 'inline'), 0);
});

b.addEventListener('mousedown', evt => {
    console.log('b', evt);
});

Я нашел решение, которое работает с Chrome и Safari, но Firefox не примет продолжение нажатия и перетаскивания таким образом.

https://jsfiddle.net/8w5x7e1s/155/

var a = document.querySelector('#a');

a.addEventListener('mousedown', evt => {
  a.style.display = 'none';

  const { clientX, clientY } = evt;

  let range;
  if (document.caretPositionFromPoint) {
    downPos = document.caretPositionFromPoint(clientX, clientY);
    range = document.createRange();
    range.setStart(downPos.offsetNode, downPos.offset);
  } else if (document.caretRangeFromPoint) {
    range = document.caretRangeFromPoint(clientX, clientY);
  }

  const selection = window.getSelection();
  selection.removeAllRanges();
  setTimeout(() => (selection.addRange(range)), 0);

  window.addEventListener('mouseup', () => {
    a.style.display = 'inline';
    // destroy self
  });
});

Какие-нибудь мысли? Совершенно другой подход тоже подойдет, но мы остановились на React/ProseMirror.

0 ответов

Другие вопросы по тегам