Javascript для всплывающей подсказки текста в мобильных браузерах

Я хочу открыть всплывающую подсказку рядом с текстом, выбранным в мобильном браузере (например, Chrome в Android). Поскольку выделение текста в мобильных браузерах не вызывает события мыши, я не могу использовать mouseup событие.

document.addEventListener("selectionchange", function(event) {

    var text = window.getSelection().toString();
    var tooltip = document.getElementById('tooltip');
    var x = event.clientX; // The problem
    var y = event.clientY; // The Problem
    tooltip.innerHTML = text;
    tooltip.style.top = x + 'px';
    tooltip.style.left = y + 'px';
});

Проблема в том, что ClientX а также ClientY не работать с selectionchange,

Проверьте JSFiddle.

2 ответа

Решение

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

document.addEventListener("selectionchange", function(event) {
  const selection = window.getSelection();
  
  if (selection.rangeCount === 0) {
    return;
  }

  const range = selection.getRangeAt(0);
  const rect = range.getBoundingClientRect();
  const text = selection.toString();
  const tooltip = document.getElementById('tooltip');

  tooltip.innerHTML = text;
  tooltip.style.top = rect.bottom + 5 + 'px'; // 5px offset
  tooltip.style.left = rect.x + 5 + 'px';     // 5px offset
  tooltip.style.position = 'absolute';
  tooltip.style.background = 'lightgreen';
});
This is some text
<div id="tooltip">

Вы можете добавить событие mouseup и сделать этот код в обработчике события mouseup.

var tooltip = document.getElementById('tooltip');
document.addEventListener("selectionchange", function(event) {
    var text = window.getSelection().toString();
    tooltip.innerHTML = text;
});

document.addEventListener("mouseup", function(event){
    var x = -1000;
    var y = -1000;
    if(tooltip.innerHTML!=""){
        x =event.clientX;
        y = event.clientY;
    }
    tooltip.style.top = x + 'px';
    tooltip.style.left = y + 'px';
});

Я также проверил это на jsFiddler.

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