05.05.2010, 13:31
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Начало и конец выделения в HTML
Есть обычная текстовая страница, отданная сервером из БД, не WYSIWYG-редактор.
Выделяем какой-то текст, появляется всплывающее меню:
По нажатию на пункт всплывающего меню, на клиенте выделенный текст визуально становится ссылкой, адрес которой получаю с помощью XMLHttpRequest .
Вопрос: каким образом указать серверу начало и конец выделения, чтобы он мог проделать аналогичные действия со страницей в БД?
HTML отправлять бесполезно, браузеры его по своему форматируют, да и это не textarea , чтобы точно определить количество символов с начала блока. Есть идеи?
|
|
05.05.2010, 13:39
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Свойство anchorOffset объекта Selection?
|
|
05.05.2010, 17:49
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
anchorOffset — смещение начала выделения относительно anchorNode, которым может быть текстовый узел.
Можно поставить левую границу Range в начало контейнера с текстом, а правую — в начало выделения и получить range.toString().length, но браузеры даже количество пробельных символов по разному возвращают. Пока думаю отправлять этот кусок на сервер и там приводить его к общему виду с текстом из БД, удаляя все теги, дублирующиеся пробелы, переносы строк, как-то высчитывать разницу и добавлять ссылку в HTML, как оно там будет работать на сервере уже не моя проблема, мне нужно однозначно указать, какой участок текста поместить в тег.
Последний раз редактировалось Octane, 05.05.2010 в 18:16.
|
|
05.05.2010, 18:04
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Octane, а может, лучше сделать обрамление на JS, а потом весь кусок отправить на сервер и там уже просто сохранить в БД? Смысл еще что-то делать на сервере?
|
|
05.05.2010, 18:19
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
var start = (elem.textContent||elem.innerText).search(selectedText), finish = start+selectedText.length;
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
05.05.2010, 18:28
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
e1f,
да думал над этим, но мало ли что пользователь может отправить на сервер, нужна только возможность добавить ссылку, а не изменить весь текст. Тогда придется сравнивать видоизмененный браузером HTML с исходным кодом. Определить, что там только вставлена ссылка и никакой текст больше не тронут, и только тогда перезаписывать его в БД. Это реально?)
Nekromancer,
как посчитать символы я знаю, проблема в том, что на клиенте и на сервере разный HTML-код получается и однозначно указать, куда вставить тег в HTML-код на сервере, не знаю как.
Последний раз редактировалось Octane, 05.05.2010 в 18:43.
|
|
05.05.2010, 18:43
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Octane, Если не нужен полный wysiwyg, тогда конечно, не стоит
Насколько я понимаю, выделенный текст может быть и "между тегами", а в базе хранится кусок html-разметки?
|
|
05.05.2010, 18:46
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
Octane,
ну вот тут мы считаем не html, а сам текст.. разве с базой так же нельзя поступить, "забить" на теги?
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
05.05.2010, 18:55
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
К примеру на сервере в БД такой код:
<div class="post" id="_12345">
<p>Lorem Ipsum is <strong>simply</strong> dummy text.</p>
</div>
Internet Explorer отдаст в JavaScript его уже в таком виде:
<DIV id=_12345 class="post"><P>Lorem Ipsum is <STRONG>simply</STRONG> dummy text.</P></DIV>
Добавляем в дерево ссылку и получаем такой HTML-код:
<DIV id=_12345 class="post"><P>Lorem <A href="…">Ipsum is <STRONG>simply</STRONG> dummy</A> text.</P></DIV>
Вот и нужно сказать серверу, чтобы он тоже самое сделал с кодом в БД
|
|
05.05.2010, 19:00
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
Хорошо, а нельзя никак сохранить исходный html в js, когда пользователь выделит текст - вычислить это место и вставить в сохранённом html ссылку. И уже дальше так оперировать?
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
|
|