Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Склеить стоящие рядом одинаковые ноды. (https://javascript.ru/forum/events/5215-skleit-stoyashhie-ryadom-odinakovye-nody.html)

Dima 26.09.2009 22:25

Склеить стоящие рядом одинаковые ноды.
 
Дано:
<i>текст курсивом</i><i>еще текст курсивом</i> <b>жирный текст</b>

Нужно склеить стоящие рядом узлы с одинаковым nodeName. Не знаю, как будет эффективней: прогуляться по дереву или к innerHTML применить регулярку? Возможно, у кого-нибудь есть интересные решения. Спасибо.

Gvozd 26.09.2009 23:33

Цитата:

Сообщение от Dima
к innerHTML применить регулярку?

и заодно перерисовать с нуля все окно?
только пробежка по дереву
PS не забудь что такие теги как <li> к примеру не должны быть объеденены
PPS не додумайся использовать getElementsByTagName('*').
его результат не массив элементов, а DOMNodeList
PPPS ассинхонность для снятия нагрузки тут не подойдет, в том случае, если у объединяемых элементов могут быть дети-также объединямые теги
и в довершение: "а нафига?"

Dima 27.09.2009 00:31

Пишу велосипед-wysiwyg. Пересмотрел многие опенсорсные решения и захотелось:
div с contentEditable=true вместо iframe. При помощи дива очень просто сделать autogrow для редактируемой области.
cleaner при onpaste
параграф при двойном [enter] и br при одиночном.
минимальный объем кода с минимумом доступных опций.

Gvozd, спасибо за подсказки, учту.

Octane 27.09.2009 08:22

Лучше собирать html-строку при обходе DOM-дерева, а потом сразу заменить весь document.body.innerHTML. Так работа превратится в написание конечного автомата, который в зависимости от состояния будет дописывать в строку нужные открывающие и закрывающие теги.
Если же работать, используя методы DOM для перестроения дерева, алгоритм во много раз усложнится и скорость выполнения скрипта упадет.
Я писал модуль для WYSIWYG-редактора, который преобразует весь код в нормальное состояние, заменяя deprecated-теги соответствующими CSS-стилями, объединяя одинаковые подрядидущие теги, удаляя пустые теги и т.д., вышло чуть больше 1000 строк кода :) пытался реализовывать разными способами, но в итоге остановился на конечном автомате, собирающем новый HTML-код в строку, основываясь на данных, полученных при обходе DOM дерева.

Dima 27.09.2009 10:44

Octane, я еще не разобрался с конечными автоматами, в теории понятно, на практике нет. Буду счастлив, если вы вышлете пример своего модуля мне на почту dima[собака]dima.by, чтобы посмотреть реализацию конечного автомата уже на понятном мне примере.

Octane 27.09.2009 12:16

Прислать не могу, проект коммерческий был :)


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