Как получить selection.range перед событием mousedown?
Я не понимаю, почему я не могу получить правильный объект диапазона. Мне трудно объяснить проблему.
Например: у меня есть пять div, каждый div содержит фразу. Логически, если я запускаю mousedown-событие в одном из этих div, я могу получить цель-событие. Хорошо, это элементарно.
Но если я работаю с объектом range в событии mousedown, цель-событие - это то, что я щелкнул, но range.startContainer указывает на предыдущий div;
Проверьте эту скрипку
1 LineLineLine
2 LineLineLineLineLine
3 LineLineLineLine
4 LineLineLine
5 LineLineLineLine
Шаги для воспроизведения проблемы (см. Консоль):
- Удерживайте кнопку мыши в первой строке (консоль скажет "undefined" [*])
- Отпустите кнопку мыши (теперь диапазон надежно указывает на первую строку)
- Удерживайте кнопку мыши на четвертой строке (консоль скажет "первая линия")
Консоль покажет предыдущую нажатую строку
[*] Не определено, потому что у документа еще нет диапазона, но это несущественно, потому что я могу создать его на лету и вставить его в документ.
Я могу сделать вывод, что событие mousedown выполняется раньше диапазона. Или нет?
1 ответ
Я не думаю, что вы можете получить правильный диапазон на mousedown, триггер быстрее, чем обнаружение диапазона. Вы можете использовать mouseup ( демо):
$("div.line").mouseup(setPos);
Или добавьте небольшую задержку ( демо):
$("div.line").mousedown(function() {
setTimeout(setPos, 4);
});