@ZaxapKramer
Больной верстальщик

Как обернуть каждый тег в несколько DIV'ов, содержащих по атрибуту от этих самых тегов?

Есть html:
<p id="p1-id" class="p1-class" data-attribute="data-value">
	my
	<p сlass="p2-class1 p2-class2">
		super <i class="italic"><b>paragraph</b></i>
	</p>
</p>


Необходимо обернуть каждый тег в некоторое количество DIV, равное количеству атрибутов этих самых тегов. То есть, в итоге должно получиться нечто такое:
<div  id="p1-id">
	<div class="p1-class">
		<div data-attribute="data-value">
			<p>
				my
				<div сlass="p2-class1 p2-class2">
					<p>
						super
						<div class="italic">
							<i><b>paragraph</b></i>
						</div>
					</p>
				</div>
			</p>
		</div>
	</div>
</div>


Очень долго мучаюсь с этим, в итоге сталкиваюсь с непониманием того, как это вообще должно быть и/или работать.
Есть цикл, но он либо бесконечен, либо прерывается с ошибкой ввиду замены изначального тега создаваемым вокруг него DIV'ом => невозможно обернуть этот тег во второй-третий-...-n-ый DIV...

Как это осуществить?

Вот мой код, точнее, последний его вариант (нерабочий (неправильно работающий)):
var els = document.body.getElementsByTagName("*"); // Получение вышеупомянутого html
var el = els[0], c = 0;
while (el) {
	if (el.hasAttributes()) {
		for (var i = 0, attrs = el.attributes, l = attrs.length; i < l; i++) {
			var attr = attrs[i], attr_name = attr.name;
			var wrapper = document.createElement("div");
			wrapper.setAttribute(attr_name, attr.value);

			var parent  = el.parentNode;
			var sibling = el.nextSibling;

			wrapper.appendChild(el);

			if (sibling) {
				parent.insertBefore(wrapper, sibling);
			} else {
				parent.appendChild(wrapper);
			}
		};
	}
	c++;
	el = els[c];
};
  • Вопрос задан
  • 329 просмотров
Решения вопроса 1
@ZaxapKramer Автор вопроса
Больной верстальщик
Решил проблему заменой getElementsByTagName() на querySelectorAll() - получил статический NodeList взамен динамического HTMLCollection. Других способов получить статическую "коллекцию" не нашел, увы...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы