Полезная информация

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№121-02-2006 18:46:12

Sarin2.0
Участник
 
Группа: Members
Зарегистрирован: 18-01-2006
Сообщений: 58

А можноль получить выделение вместе с тегами?

Выделить код

Код:

document.defaultView.getSelection()

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

Отсутствует

 

№221-02-2006 23:46:10

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: А можноль получить выделение вместе с тегами?

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 определите начальную/конечную позицию выделения.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№321-02-2006 23:48:51

Sarin2.0
Участник
 
Группа: Members
Зарегистрирован: 18-01-2006
Сообщений: 58

Re: А можноль получить выделение вместе с тегами?

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

Код:

document.defaultView.getSelection()

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

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

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

Отсутствует

 

№421-02-2006 23:57:46

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: А можноль получить выделение вместе с тегами?

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№522-02-2006 15:13:40

Sarin2.0
Участник
 
Группа: Members
Зарегистрирован: 18-01-2006
Сообщений: 58

Re: А можноль получить выделение вместе с тегами?

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:. И всё.

Отсутствует

 

№622-02-2006 16:24:42

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: А можноль получить выделение вместе с тегами?

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 код, определяющий эти самые позиции.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№722-02-2006 18:17:00

Sarin2.0
Участник
 
Группа: Members
Зарегистрирован: 18-01-2006
Сообщений: 58

Re: А можноль получить выделение вместе с тегами?

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

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

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

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

Отсутствует

 

№822-02-2006 18:20:41

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: А можноль получить выделение вместе с тегами?

Sarin2.0 пишет

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

А так

Выделить код

Код:

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

?

Отредактировано Anton (22-02-2006 18:21:43)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№922-02-2006 18:29:49

Sarin2.0
Участник
 
Группа: Members
Зарегистрирован: 18-01-2006
Сообщений: 58

Re: А можноль получить выделение вместе с тегами?

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

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

А так

Выделить код

Код:

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

?

Гы:)

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

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

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

Отсутствует

 

№1022-02-2006 18:39:49

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: А можноль получить выделение вместе с тегами?

Sarin2.0 пишет

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1115-10-2008 20:21:40

gena.web
Участник
 
Группа: Members
Зарегистрирован: 15-10-2008
Сообщений: 2
UA: Firefox 2.0

Re: А можноль получить выделение вместе с тегами?

Господа профессионалы! Взываю к вашему опыту! Разбираю код из популярной статьи "Пишем правильный 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 как надо...

Отсутствует

 

№1215-10-2008 21:21:22

gena.web
Участник
 
Группа: Members
Зарегистрирован: 15-10-2008
Сообщений: 2
UA: Firefox 2.0

Re: А можноль получить выделение вместе с тегами?

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

Выделить код

Код:

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

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

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]