Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Начало и конец выделения в HTML (https://javascript.ru/forum/misc/9218-nachalo-i-konec-vydeleniya-v-html.html)

Octane 05.05.2010 13:31

Начало и конец выделения в HTML
 
Есть обычная текстовая страница, отданная сервером из БД, не WYSIWYG-редактор.
Выделяем какой-то текст, появляется всплывающее меню:

По нажатию на пункт всплывающего меню, на клиенте выделенный текст визуально становится ссылкой, адрес которой получаю с помощью XMLHttpRequest.

Вопрос: каким образом указать серверу начало и конец выделения, чтобы он мог проделать аналогичные действия со страницей в БД?

HTML отправлять бесполезно, браузеры его по своему форматируют, да и это не textarea, чтобы точно определить количество символов с начала блока. Есть идеи?

B@rmaley.e><e 05.05.2010 13:39

Свойство anchorOffset объекта Selection?

Octane 05.05.2010 17:49

anchorOffset — смещение начала выделения относительно anchorNode, которым может быть текстовый узел.

Можно поставить левую границу Range в начало контейнера с текстом, а правую — в начало выделения и получить range.toString().length, но браузеры даже количество пробельных символов по разному возвращают. Пока думаю отправлять этот кусок на сервер и там приводить его к общему виду с текстом из БД, удаляя все теги, дублирующиеся пробелы, переносы строк, как-то высчитывать разницу и добавлять ссылку в HTML, как оно там будет работать на сервере уже не моя проблема, мне нужно однозначно указать, какой участок текста поместить в тег.

e1f 05.05.2010 18:04

Octane, а может, лучше сделать обрамление на JS, а потом весь кусок отправить на сервер и там уже просто сохранить в БД? Смысл еще что-то делать на сервере?

Nekromancer 05.05.2010 18:19

var start = (elem.textContent||elem.innerText).search(selectedText), finish = start+selectedText.length;

Octane 05.05.2010 18:28

e1f,
да думал над этим, но мало ли что пользователь может отправить на сервер, нужна только возможность добавить ссылку, а не изменить весь текст. Тогда придется сравнивать видоизмененный браузером HTML с исходным кодом. Определить, что там только вставлена ссылка и никакой текст больше не тронут, и только тогда перезаписывать его в БД. Это реально?)

Nekromancer,
как посчитать символы я знаю, проблема в том, что на клиенте и на сервере разный HTML-код получается и однозначно указать, куда вставить тег в HTML-код на сервере, не знаю как.

e1f 05.05.2010 18:43

Octane, Если не нужен полный wysiwyg, тогда конечно, не стоит :)
Насколько я понимаю, выделенный текст может быть и "между тегами", а в базе хранится кусок html-разметки?

Nekromancer 05.05.2010 18:46

Octane,
ну вот тут мы считаем не html, а сам текст.. разве с базой так же нельзя поступить, "забить" на теги?

Octane 05.05.2010 18:55

К примеру на сервере в БД такой код:
<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>

Вот и нужно сказать серверу, чтобы он тоже самое сделал с кодом в БД :)

Nekromancer 05.05.2010 19:00

Хорошо, а нельзя никак сохранить исходный html в js, когда пользователь выделит текст - вычислить это место и вставить в сохранённом html ссылку. И уже дальше так оперировать?


Часовой пояс GMT +3, время: 18:44.