删除一个HTML标签,但保持innerHtml

我有一些简单的HTML,我需要去掉简单的格式。

A nice house was found in <b>Toronto</b>. 

我需要删除粗体,但保留完整的句子。

这怎么可能在jQuery中?

 $('b').contents().unwrap(); 

这将select所有的<b>元素,然后使用.contents()来定位<b>的文本内容, 然后使用.unwrap()移除它的父元素。


为了获得最大的performance,永远都是原生的:

 var b = document.getElementsByTagName('b'); while(b.length) { var parent = b[ 0 ].parentNode; while( b[ 0 ].firstChild ) { parent.insertBefore( b[ 0 ].firstChild, b[ 0 ] ); } parent.removeChild( b[ 0 ] ); } 

这将比这里提供的任何jQuery解决scheme快得多。

你也可以使用.replaceWith() ,像这样:

 $("b").replaceWith(function() { return $(this).contents(); }); 

或者如果你知道这只是一个string:

 $("b").replaceWith(function() { return this.innerHTML; }); 

如果你打开大量的元素,这可能会有很大的不同,因为上面的方法比.unwrap()的成本要.unwrap()

JQuery .text()函数是删除内部html元素并仅返回文本的最简单方法。

例:

 var text = $('<p>A nice house was found in <b>Toronto</b></p>'); alert( text.html() ); //Outputs A nice house was found in <b>Toronto</b> alert( text.text() ); ////Outputs A nice house was found in Toronto 

jsFiddle演示

这个怎么样?

 $("b").insertAdjacentHTML("afterend",$("b").innerHTML); $("b").parentNode.removeChild($("b")); 

第一行将b标记的HTML内容复制到紧跟在b标记之后的位置,然后第二行从DOM删除b标记,仅留下其复制的内容。

我通常将其包含在一个函数中,以便于使用:

 function removeElementTags(element) { element.insertAdjacentHTML("afterend",element.innerHTML); element.parentNode.removeChild(element); } 

所有的代码实际上是纯Javascript,唯一使用的JQuery是select要定位的元素(第一个示例中的b标签)。 这个函数只是纯JS:D

另请看:

另一种本地解决scheme(咖啡):

 el = document.getElementsByTagName 'b' docFrag = document.createDocumentFragment() docFrag.appendChild el.firstChild while el.childNodes.length el.parentNode.replaceChild docFrag, el 

我不知道它是否比user113716的解决scheme,但它可能会更容易理解一些。