删除一个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,但它可能会更容易理解一些。