Страницы: 1
возвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались.
Отсутствует
возвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались.
Вот функция из того самого визивика:
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ентов на части порвет !!!
Отсутствует
Sarin2.0 пишетвозвращает текст выделенный на странице. Однако текст получается без какой либо разметки. А можно ли получить текст, содержащийся на странице. Тоесть чтоб теги не опускались.
Вот функция из того самого визивика:
Блин. Совсем плохой стал... Спасибо. Щас потестим.
Отсутствует
p.s. Вместо getTopWin() надо писать window (getTopWin() - это функция, которую я использую чтобы в javascript environment extension developer'а получить ссылку на окно браузера).
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
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:. И всё.
Отсутствует
...
Туплю. Чёт не пашет.Выделить кодКод:
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ентов на части порвет !!!
Отсутствует
Ррррррррр!!!
var selection = document. getElementById ('wysiwyg_iframe'). contentWindow. getSelection ();
alert(selection.getRangeAt(0).startContainer, selection.getRangeAt(0).endContainer);
при выделении текста, который помещён в теги <b> выкидывает alert с одним единственным словом: [object Text].
Моя щас застрелица!
Где теги <b> и </b>?!
Отсутствует
...
Где теги <b> и </b>?!
А так
alert(selection.getRangeAt(0).startContainer. parentNode. innerHTML, selection.getRangeAt(0).endContainer. parentNode. innerHTML);
?
Отредактировано Anton (22-02-2006 18:21:43)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Sarin2.0 пишет...
Где теги <b> и </b>?!А так
Выделить кодКод:
alert(selection.getRangeAt(0).startContainer. parentNode. innerHTML, selection.getRangeAt(0).endContainer. parentNode. innerHTML);?
Гы
Я уж сам допёр по ОМД попробовать ошарить.
parentNode возвращает HTMLBodyElement. innerHTML возвращает то, что и должен. Текст введённый в поле редактирования.
НО! Периодически (я не заметил никакой закономерности) при выделении ровно того-же текста возвращается HTMLSpanElement. ИннерХТМЛ которого - выделенный текст. Без обрамляющих тегов!
Отсутствует
...ИннерХТМЛ которого - выделенный текст. Без обрамляющих тегов!
Кроме selection.getRangeAt(0).startContainer есть ещё selection.getRangeAt(0).endContainer и selection.getRangeAt(0).commonAncestorContainer.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Господа профессионалы! Взываю к вашему опыту! Разбираю код из популярной статьи "Пишем правильный 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 как надо...
Отсутствует
немного продвинулся, поэтому конкретизирую вопрос:
почему после
start.nodeValue выдает текст, содержащийся слева от реально выделенного, притом что в самом selection - то что надо?????
Отсутствует
Страницы: 1