>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >А можноль получить выделение вместе с тегами? http://forum.mozilla-russia.org/viewtopic.php?id=8545 |
Sarin2.0 > 21-02-2006 18:46:12 |
возвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались. |
Anton > 21-02-2006 23:46:10 |
Sarin2.0 пишет
Вот функция из того самого визивика: Выделить код Код: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 определите начальную/конечную позицию выделения. |
Sarin2.0 > 21-02-2006 23:48:51 |
Anton пишет
Блин. Совсем плохой стал... Спасибо. Щас потестим. |
Anton > 21-02-2006 23:57:46 |
p.s. Вместо getTopWin() надо писать window (getTopWin() - это функция, которую я использую чтобы в javascript environment extension developer'а получить ссылку на окно браузера). |
Sarin2.0 > 22-02-2006 15:13:40 |
Anton пишет
Туплю. Чёт не пашет. Выделить код Код: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:. И всё. |
Anton > 22-02-2006 16:24:42 |
Sarin2.0 пишет
Итак, вы реализуете тот самый визивик. Так и делайте тогда так, как там в 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 код, определяющий эти самые позиции. |
Sarin2.0 > 22-02-2006 18:17:00 |
Ррррррррр!!! var selection = document. getElementById ('wysiwyg_iframe'). contentWindow. getSelection (); Моя щас застрелица! Где теги <b> и </b>?! |
Anton > 22-02-2006 18:20:41 |
Sarin2.0 пишет
А так Выделить код Код:alert(selection.getRangeAt(0).startContainer. parentNode. innerHTML, selection.getRangeAt(0).endContainer. parentNode. innerHTML); ? |
Sarin2.0 > 22-02-2006 18:29:49 |
Anton пишет
Гы Я уж сам допёр по ОМД попробовать ошарить. parentNode возвращает HTMLBodyElement. innerHTML возвращает то, что и должен. Текст введённый в поле редактирования. НО! Периодически (я не заметил никакой закономерности) при выделении ровно того-же текста возвращается HTMLSpanElement. ИннерХТМЛ которого - выделенный текст. Без обрамляющих тегов! |
Anton > 22-02-2006 18:39:49 |
Sarin2.0 пишет
Кроме selection.getRangeAt(0).startContainer есть ещё selection.getRangeAt(0).endContainer и selection.getRangeAt(0).commonAncestorContainer. |
gena.web > 15-10-2008 20:21:40 |
Господа профессионалы! Взываю к вашему опыту! Разбираю код из популярной статьи "Пишем правильный 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 как надо... |
gena.web > 15-10-2008 21:21:22 |
немного продвинулся, поэтому конкретизирую вопрос: start.nodeValue выдает текст, содержащийся слева от реально выделенного, притом что в самом selection - то что надо????? |