Доступ к сенсорным свойствам в Windows Chrome # 74 - PullRequest
0 голосов
/ 01 мая 2019

Я столкнулся с проблемой, поднятой здесь и здесь . Мое приложение d3 отлично работает на Chrome с помощью сенсорного дисплея на Mac, но d3.drag не удалось, когда я переключился на производственную машину Windows, на которой работает Chrome v.74. Я применил решение .touchable(navigator.maxTouchPoints), как предложено на связанных страницах выше. Это позволило мне перетащить элемент в Windows Chrome v.74 с помощью сенсорного экрана, но теперь я получаю:

UncaughtTypeError: Не удалось выполнить 'elementFromPoint' для 'Document': предоставленное двойное значение не является конечным.

так что мои события перетаскивания не запускаются.

Я использую document.elementFromPoint (), чтобы определить, когда перетаскиваемый элемент находится над другим элементом:

this.svg.dragCirclesGroup
   .call(drag()
     .touchable(navigator.maxTouchPoints)
     .on("start", this.dragStarted)
     .on("drag", this.dragged)
     .on("end", this.dragEnded));

dragged() {
  select(this).attr("transform","translate("+[event.x,event.y]+")")
  let hitZone = select(document.elementFromPoint(event.sourceEvent.clientX, event.sourceEvent.clientY)).attr("id");
  if ((hitZone == "yHitZone") || (hitZone == "xHitZone")) {
    select('body').classed("plus", true);
  } else {
    select('body').classed("plus", false);
  }
}

Это проблема только касания, так как перетаскивание и document.elementFromPoint отлично работают, когда я использую мышь.

1 Ответ

0 голосов
/ 04 мая 2019

Решения, предлагаемые Не удается получить координаты касаний в Javascript на устройствах Android и Существует ли эквивалент позиции e.PageX для события "touchstart", как и для события щелчка? не применяется в Chrome # 74 для Windows 10. Чтобы получить доступ к соответствующим TouchLists и координатам для события перетаскивания e, вы должны использовать

e.sourceEvent.touches.item(0).clientX и e.sourceEvent.touches.item(0).clientY

для перетаскивания и

e.sourceEvent.changedTouches.item(0).clientX и e.sourceEvent.changedTouches.item(0).clientY

для координат на конце перетаскивания.

Вы можете увидеть это, войдя в систему e.sourceEvent. Этот SO ответ , в котором подробно описаны различные сенсорные списки, также полезен.

Таким образом, чтобы выполнить document.elementFromPoint в этой среде, вы должны использовать

document.elementFromPoint(e.sourceEvent.changedTouches.item(0).clientX, e.sourceEvent.changedTouches.item(0).clientY)
...