Выделить код

Код:

document.defaultView.getSelection()

возвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались.

Sarin2.0 пишет
Выделить код

Код:

document.defaultView.getSelection()

возвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались.

Вот функция из того самого визивика:

Выделить код

Код:

function get_selection ()
{
    var selection = getTopWin(). getBrowser (). contentDocument. defaultView. getSelection ();
    // Выделение, вообще говоря, может состоять из нескольких областей.
    // Но при написании редактора нас это не должно заботить, берем 0-ую:
    range = selection.getRangeAt(0)
    
    start = range.startContainer
    end = range.endContainer
    root = range.commonAncestorContainer
    if(start == end) root = start
    
    if(start.nodeName.toLowerCase() == "body") return null
    // если узлы текстовые, берем их родителей
    if(start.nodeName == "#text") start = start.parentNode
    if(end.nodeName == "#text") end = end.parentNode
    
    return {
     root: root,
     start: start,
     end: end,
     startPos: range. startOffset,
     endPos: range. endOffset
    }
}

практически без изменений. Через start.parentNode.innerHTML,end.parentNode.innerHTML (а может быть и через start.innerHTML,end.innerHTML,root.innerHTML) найдёте все нужные теги. Через startPos/endPos определите начальную/конечную позицию выделения.

Anton пишет
Sarin2.0 пишет
Выделить код

Код:

document.defaultView.getSelection()

возвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались.

Вот функция из того самого визивика:

Блин. Совсем плохой стал... Спасибо. Щас потестим.

p.s. Вместо getTopWin() надо писать window (getTopWin() - это функция, которую я использую чтобы в javascript environment extension developer'а получить ссылку на окно браузера).

Anton пишет

p.s. Вместо getTopWin() надо писать window (getTopWin() - это функция, которую я использую чтобы в javascript environment extension developer'а получить ссылку на окно браузера).

Туплю. Чёт не пашет.

Выделить код

Код:

function get_selection ()
{
   var selection = document.getElementById('wysiwyg_iframe'). contentDocument. defaultView. getSelection ();
   
    range = selection.getRangeAt(0)
    start = range.startContainer
    end = range.endContainer
    root = range.commonAncestorContainer
    alert('start: ', start, ' end: ', end, ' root: ', root)
    if(start == end) root = start
    
    if(start.nodeName.toLowerCase() == "body") return null
    // если узлы текстовые, берем их родителей
    if(start.nodeName == "#text") start = start.parentNode
    if(end.nodeName == "#text") end = end.parentNode
    
    alert('start: ', start, ' end: ', end, ' root: ', root)
    
    return {
     root: root,
     start: start,
     end: end,
     startPos: range. startOffset,
     endPos: range. endOffset
    }
}

Выкидывает два аллерта со словом start:. И всё.

Sarin2.0 пишет

...
Туплю. Чёт не пашет.

Выделить код

Код:

function get_selection ()
{
   var selection = document.getElementById('wysiwyg_iframe'). contentDocument. defaultView. getSelection ();
...

Выкидывает два аллерта со словом start:. И всё.

Итак, вы реализуете тот самый визивик. Так и делайте тогда так, как там в js написано. Вот так:

Выделить код

Код:

var selection = document. getElementById ('wysiwyg_iframe'). contentWindow. getSelection ();

Далее. Приведённая мною функция get_selection - это переделанная функция get_selection_bounds. get_selection_bounds в оригинале имеет две ветки выполнения для FF/Opera и для IE, и не возвращает startPos/endPos. get_selection, очевидно, содержит только одну ветвь выполнения, именно, для FF/Opera. Так что в IE get_selection не работает. Как в IE получить startPos/endPos я не знаю. Если нужна кроссбраузерность, просто используйте функцию get_selection_bounds. Если также требуются начальная/конечная позиции выделения - можете переделать ветку FF/Opera функции get_selection_bounds так, как это сделано в get_selection и добавить в ветку IE функции get_selection_bounds код, определяющий эти самые позиции.

Ррррррррр!!!

var selection = document. getElementById ('wysiwyg_iframe'). contentWindow. getSelection ();
alert(selection.getRangeAt(0).startContainer, selection.getRangeAt(0).endContainer);
при выделении текста, который помещён в теги <b> выкидывает alert с одним единственным словом: [object Text].

Моя щас застрелица!

Где теги <b> и </b>?!

Sarin2.0 пишет

...
Где теги <b> и </b>?!

А так

Выделить код

Код:

alert(selection.getRangeAt(0).startContainer. parentNode. innerHTML, selection.getRangeAt(0).endContainer. parentNode. innerHTML);

?

Anton пишет
Sarin2.0 пишет

...
Где теги <b> и </b>?!

А так

Выделить код

Код:

alert(selection.getRangeAt(0).startContainer. parentNode. innerHTML, selection.getRangeAt(0).endContainer. parentNode. innerHTML);

?

Гы:)

Я уж сам допёр по ОМД попробовать ошарить.

parentNode возвращает HTMLBodyElement. innerHTML возвращает то, что и должен. Текст введённый в поле редактирования.

НО! Периодически (я не заметил никакой закономерности) при выделении ровно того-же текста возвращается HTMLSpanElement. ИннерХТМЛ которого - выделенный текст. Без обрамляющих тегов!

Sarin2.0 пишет

...ИннерХТМЛ которого - выделенный текст. Без обрамляющих тегов!

Кроме selection.getRangeAt(0).startContainer есть ещё selection.getRangeAt(0).endContainer и selection.getRangeAt(0).commonAncestorContainer.

Господа профессионалы! Взываю к вашему опыту! Разбираю код из популярной статьи "Пишем правильный online WYSIWYG-редактор" и столкнулся с проблемой inline - форматирования в FF. Методом дебага алертом ( smile ) установил, что ошибка возникает на этапе поиска узла font для замены его на span.
   

Выделить код

Код:

range = selection.getRangeAt(0);
start = range.startContainer;
end = range.endContainer;
root = range.commonAncestorContainer;
if(start.nodeName.toLowerCase() == "body") return null;
// если узлы текстовые, берем их родителей
if(start.nodeName == "#text") start = start.parentNode;
if(end.nodeName == "#text") end = end.parentNode;

здесь по коду просматривается выделенный текст, который расположен в тегах font. В FF вместо font в качестве родителя для узла #text почемуто принимается body. из-за этого соответственно невозможно заменить сразу после создания посредством ForeColor узла font на span, т.к. font просто не получается получить как node(((( При том, что в Опере все корректно. т.е. parentNode того start что получается на 3-й строке равен font как надо...

немного продвинулся, поэтому конкретизирую вопрос:
почему после

Выделить код

Код:

range = selection.getRangeAt(0);
start = range.startContainer;

start.nodeValue выдает текст, содержащийся слева от реально выделенного, притом что в самом selection - то что надо?????