Какой лучший способ удалить все теги из блока DOM, кроме одного конкретного тега с jQuery?

0

У меня есть фрагмент HTML, который я хотел бы проанализировать и удалить все теги html, за исключением определенного тега, который я хочу сохранить. Я уже сделал это, но я думаю, что есть лучший способ сделать это. В приведенном ниже примере я просто хочу сохранить тег em (чтобы сохранить выделенный текст):

html = "<div><b>Info:</b> <p>This is a <em>HTML</em> block that <span>I would like</span> to parse and fix</p></div>";
description = $(html).text();
var ems = $(html).find("em"); // Find all em tags

// Search on the original description for each em text, and add the tag between.
$(ems).each(function(){ 
    description = description.replace(this.innerHTML, "<em>" + this.innerHTML + "</em>");     
});
console.log(description);

Результатом этого кода является:

Info: This is a <em>HTML</em> block that I would like to parse and fix

Любая другая идея для этого?

Не обязательно должен быть jQuery, может быть чистым javascript.

благодаря

Теги:
dom

2 ответа

1
Лучший ответ

Вы можете использовать .unwrap(), чтобы сделать это

html = "<div><b>Info:</b> <p>This is a <em>HTML</em> block that <span>I would like</span> to parse and fix</p></div>";
var $h = $('<div>'+html+'</div>');
$h.find('*:not(em)').contents().unwrap();

console.log($h.html())

Демо: скрипка

0

Мне кажется, что вы хотите заменить все элементы своим содержимым, за исключением <em>:

var tmp = document.createElement('div');
tmp.innerHTML = html;
var tags = tmp.getElementsByTagName('*'), l = tags.length, i;
for( i=0; i<l; i++) {
    if( tags[i].tagName == "EM") continue;
    while(tags[i].firstChild) {
        tags[i].parentNode.insertBefore(tags[i].firstChild,tags[i]);
    }
    tags[i].parentNode.removeChild(tags[i]);
}
var result = tmp.innerHTML;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню