Как получить selection.range перед событием mousedown?

Я не понимаю, почему я не могу получить правильный объект диапазона. Мне трудно объяснить проблему.

Например: у меня есть пять div, каждый div содержит фразу. Логически, если я запускаю mousedown-событие в одном из этих div, я могу получить цель-событие. Хорошо, это элементарно.

Но если я работаю с объектом range в событии mousedown, цель-событие - это то, что я щелкнул, но range.startContainer указывает на предыдущий div;

Проверьте эту скрипку


 1 LineLineLine
 2 LineLineLineLineLine
 3 LineLineLineLine
 4 LineLineLine
 5 LineLineLineLine

Шаги для воспроизведения проблемы (см. Консоль):

  1. Удерживайте кнопку мыши в первой строке (консоль скажет "undefined" [*])
  2. Отпустите кнопку мыши (теперь диапазон надежно указывает на первую строку)
  3. Удерживайте кнопку мыши на четвертой строке (консоль скажет "первая линия")
  4. Консоль покажет предыдущую нажатую строку

    [*] Не определено, потому что у документа еще нет диапазона, но это несущественно, потому что я могу создать его на лету и вставить его в документ.

Я могу сделать вывод, что событие mousedown выполняется раньше диапазона. Или нет?

1 ответ

Решение

Я не думаю, что вы можете получить правильный диапазон на mousedown, триггер быстрее, чем обнаружение диапазона. Вы можете использовать mouseup ( демо):

$("div.line").mouseup(setPos);

Или добавьте небольшую задержку ( демо):

$("div.line").mousedown(function() {
    setTimeout(setPos, 4);
});
Другие вопросы по тегам