В Ace я в основном рассматриваю DOM как API для рисования. Все, что вы видите, «нарисовано» с использованием абсолютно позиционированных элементов DIV и SPAN. Текст выводится с использованием SPAN, строки (например, курсор или выделенные области) - это DIV и т. Д.
Чтобы все правильно расположить, я сначала измеряю высоту и ширину символа. Это также причина, по которой Ace работает только с монофоническими шрифтами.
Когда вы щелкаете внутри Ace, я вычисляю относительное положение мыши внутри редактора, используя getBoundingClientRect , а затем преобразовываю это в позиции символов, используя измеренный размер символов. Навигация с помощью клавиатуры аналогична.