Склеить стоящие рядом одинаковые ноды.
Дано:
<i>текст курсивом</i><i>еще текст курсивом</i> <b>жирный текст</b> Нужно склеить стоящие рядом узлы с одинаковым nodeName. Не знаю, как будет эффективней: прогуляться по дереву или к innerHTML применить регулярку? Возможно, у кого-нибудь есть интересные решения. Спасибо. |
Цитата:
только пробежка по дереву PS не забудь что такие теги как <li> к примеру не должны быть объеденены PPS не додумайся использовать getElementsByTagName('*'). его результат не массив элементов, а DOMNodeList PPPS ассинхонность для снятия нагрузки тут не подойдет, в том случае, если у объединяемых элементов могут быть дети-также объединямые теги и в довершение: "а нафига?" |
Пишу велосипед-wysiwyg. Пересмотрел многие опенсорсные решения и захотелось:
div с contentEditable=true вместо iframe. При помощи дива очень просто сделать autogrow для редактируемой области. cleaner при onpaste параграф при двойном [enter] и br при одиночном. минимальный объем кода с минимумом доступных опций. Gvozd, спасибо за подсказки, учту. |
Лучше собирать html-строку при обходе DOM-дерева, а потом сразу заменить весь document.body.innerHTML. Так работа превратится в написание конечного автомата, который в зависимости от состояния будет дописывать в строку нужные открывающие и закрывающие теги.
Если же работать, используя методы DOM для перестроения дерева, алгоритм во много раз усложнится и скорость выполнения скрипта упадет. Я писал модуль для WYSIWYG-редактора, который преобразует весь код в нормальное состояние, заменяя deprecated-теги соответствующими CSS-стилями, объединяя одинаковые подрядидущие теги, удаляя пустые теги и т.д., вышло чуть больше 1000 строк кода :) пытался реализовывать разными способами, но в итоге остановился на конечном автомате, собирающем новый HTML-код в строку, основываясь на данных, полученных при обходе DOM дерева. |
Octane, я еще не разобрался с конечными автоматами, в теории понятно, на практике нет. Буду счастлив, если вы вышлете пример своего модуля мне на почту dima[собака]dima.by, чтобы посмотреть реализацию конечного автомата уже на понятном мне примере.
|
Прислать не могу, проект коммерческий был :)
|
Часовой пояс GMT +3, время: 21:20. |