Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Удаление тега из DOM (https://javascript.ru/forum/jquery/8432-udalenie-tega-iz-dom.html)

doniv 25.03.2010 15:22

Удаление тега из DOM
 
Ребята, подскажите как удалить все теги, например <strong> и </strong> в нужном мне DOM?

Shaci 25.03.2010 15:26

http://javascript.ru/tutorial/dom/mo...lenie-uzla-dom

subzey 25.03.2010 15:37

Как-то наподобие этого.
<h1>Продажа яваскрипта оптом.</h1>

<p>Наша компания занимает оптовыми <strong>поставками яваскрипта</strong> в отдаленные горные аулы.</p>
<p>Наш <strong>яваскрипт</strong> — самый <strong>качественный яваскрипт</strong> на рынке <strong>яваскрипта</strong>!</p>

<script>
var strongs = document.getElementsByTagName("strong"); /* находим все стронги */
for (var i=strongs.length - 1; i>=0; i--){ /* для каждого из них, начиная с конца */
	var strong = strongs[i];
	var acceptor = strong.parentNode;
	while(strong.childNodes.length){ /* пока дочерние элементы не кончатся */
		var child = strong.childNodes[0]; /* первый дочерний элемент */
		strong.removeChild(child); /* выдергиваем */
		acceptor.insertBefore(child, strong); /* и вставляем прямо перед стронгом */
	};
	acceptor.removeChild(strong); /* а потом прибиваем стронг */
};
</script>

SkyLight 25.03.2010 15:40

Если с помощью jQuery (раз уж топик находится тут), то можно так:
$('strong').each(function() {
	$(this).replaceWith(document.createTextNode($(this).html()));
});

Nekromancer 25.03.2010 15:44

Цитата:

Сообщение от SkyLight (Сообщение 49033)
Если с помощью jQuery (раз уж топик находится тут), то можно так:
$('strong').each(function() {
	$(this).replaceWith(document.createTextNode($(this).html()));
});

$('strong').each(function(){
 $(this).children().first().unwrap();
});

SkyLight 25.03.2010 15:47

Согласен, так лучше, тем более что чистый jQuery. А я unwrap как-то упустил из виду. Наверное потому, что пользоваться не приходилось.

subzey 25.03.2010 16:07

Тьфу! Так это ветка jQuery. :-?

Nekromancer 25.03.2010 16:10

Цитата:

Сообщение от SkyLight (Сообщение 49035)
Согласен, так лучше, тем более что чистый jQuery. А я unwrap как-то упустил из виду. Наверное потому, что пользоваться не приходилось.

Мне тоже не приходилось, просто запомнилось :)

Цитата:

Сообщение от subzey (Сообщение 49039)
Тьфу! Так это ветка jQuery. :-?

Подумаешь, хороший ответ нигде не лишний :victory:

doniv 25.03.2010 18:51

Спасибо!

$('strong').each(function(){
 $(this).children().first().unwrap();
});

А вот эта конструкция не работает.

Aetae 25.03.2010 23:11

Кстати, вопросик почти по теме: если текст большой, тегов много и разных, не будет ли быстрее взять innerHTML и его просеять регэкспом?

Nekromancer 25.03.2010 23:38

RegExp тоже медленно работает когда много текста, это раз. Во вторых мы заменим текст полностью. У объектов потеряются все мануально установленные свойста, в некоторых браузерах и события. Ещё и фрэйма перезагрузятся) это так, на вскидку вспомнил.

Не выход короче.

Aetae 25.03.2010 23:53

Эх похоже, придётся таки тестировать самому.) События и прочее - не волнует, просто парсится 1+мб форматированного текста на предмет ненужных тегов.
У меня сейчас есть вариант через innerHTML, работает в приципе достаточно быстро.(куда дольше грузится сам текст=) ).

Просто на первый взгляд, в случае когда единожды берётся innerHTML прогоняется через реплейс и вставляется, скрипт должен работать быстрее чем через кучу операций с DOM для каждого конкретного тега. Плюс могут вылезти заморочки с вложенностью, как подумаю об этом... =)

Nekromancer 26.03.2010 11:55

А вы не думайте :yes:
Для каждой задачи свои решения, кстати IE возвращает не правильный innerHTML ...

Kolyaj 26.03.2010 11:58

Цитата:

Сообщение от Nekromancer
IE возвращает не правильный innerHTML ...

Что значит неправильный?

Nekromancer 26.03.2010 12:13

Теги в верхнем регистре и атрибуты без кавычек. С точки зрения грамотности это не очень правильно.

Kolyaj 26.03.2010 12:16

Цитата:

Сообщение от Nekromancer
Теги в верхнем регистре и атрибуты без кавычек.

Вполне себе правильный HTML.

Nekromancer 26.03.2010 12:33

Не надо сейчас вредничать :) Разве вы пишите такой html? С точки зрения html он может и правильный, а с точки зрения современного написания кода нет.

Kolyaj 26.03.2010 12:41

Что такое современное написание кода? Есть стандарты, даже как минимум два: HTML и XHTML. В XHTML innerHTML вообще нет, остаётся один. По стандарту HTML всё нормально. Firefox, кстати, как минимум удаляет / у одиночных тегов, у оперы теги тоже в верхнем регистре.

Отдавать из innerHTML то, что было получено с сервера, браузеры тоже не могут, хотя бы потому, что на выходе должен быть правильный HTML, а на входе может быть и неправильный. Но это не единственная причина.

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

subzey 26.03.2010 13:03

Цитата:

Сообщение от Aetae
взять innerHTML и его просеять регэкспом

при этом Вы потеряете обработчики событий, свойства объектов DOM и ссылки на эти объекты.

subzey 26.03.2010 13:10

Кстати, рискну, Вам нужно именно удалять эти теги, или достаточно сделать их незаметными?

<style type="text/css">
strong {font: inherit}
</style>

<h1>Продажа яваскрипта оптом.</h1> 
  
<p>Наша компания занимает оптовыми <strong>поставками яваскрипта</strong> в отдаленные горные аулы.</p> 
<p>Наш <strong>яваскрипт</strong> — самый <strong>качественный яваскрипт</strong> на рынке <strong>яваскрипта</strong>!</p>


(Ох уж, это тёмно-серое СЕО!..)


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