Проблема обнаружения новых строк в объекте диапазона JavaScript
У меня есть javascript, который управляет html на основе того, что пользователь выбрал. Для реальных браузеров методы, которые я использую, используют объект "Range", полученный как таковой:
var sel = window.getSelection();
var range = sel.getRangeAt(0);
var content = range.toString();
Переменная содержимого содержит весь выделенный текст, который отлично работает. Однако я обнаружил, что не могу обнаружить новые строки в результирующей строке. Например:
Выбранный текст:
ABC
Защита
GHI
range.toString() вычисляет значение "abcdefghi".
Любой поиск по специальным символам не возвращает экземпляр \n\f\r или даже \s. Если, однако, я записываю переменную в редактируемый элемент управления, снова появляются строки.
Кто-нибудь знает, что мне не хватает?
Может быть, что эти выборы и манипуляции находятся на редактируемых div. Такое же поведение проявляется в Chrome, FireFox и Opera. Удивительно, что IE все равно нуждается в совершенно другом коде, но там нет никаких проблем, кроме того, что это просто IE.
Большое спасибо.
Ответы
Ответ 1
Редактирование сообщения:
Экспериментируя немного, я обнаружил, что sel.toString()
возвращает новые строки в контентных div, а range.toString()
корректно возвращает строки в нормальных не редактируемых div, но не в редактируемых, как вы сообщили.
Не удалось найти объяснения поведения.
Это полезная ссылка http://www.quirksmode.org/dom/range_intro.html
Ответ 2
Я нашел по крайней мере два других способа, поэтому вы все равно можете использовать диапазон, чтобы найти положение каретки в Mozilla.
Один из способов - вызвать
var documentFragment = rangeObj.cloneContents ();
который содержит массив childNodes, и любые разрывы строк будут отображаться как node класса "HTMLBRElement".
Другой способ - убедиться, что за каждым тегом "br" следует символ новой строки (0x0a)!
Это не повредит HTML-контенту каким-либо видимым образом, но теперь все разрывы HTML преобразуются в разрывы текстовых строк, как только вызывается range.toString()!
Надеюсь, это поможет - даже если эта тема очень старая. (Я уже некромант, хе-хе):)