Проблема обнаружения новых строк в объекте диапазона 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()!


Надеюсь, это поможет - даже если эта тема очень старая. (Я уже некромант, хе-хе):)