【发布时间】:2011-05-13 02:08:29
【问题描述】:
我有一些简单的 HTML,需要去除简单的格式。
A nice house was found in <b>Toronto</b>.
我需要删除粗体,但保持句子完整。
在 jQuery 中这怎么可能?
【问题讨论】:
标签: jquery
我有一些简单的 HTML,需要去除简单的格式。
A nice house was found in <b>Toronto</b>.
我需要删除粗体,但保持句子完整。
在 jQuery 中这怎么可能?
【问题讨论】:
标签: jquery
$('b').contents().unwrap();
这会选择所有<b> 元素,然后选择uses .contents() 以定位<b> 的文本内容,then .unwrap() 以删除其父<b> 元素。
为了获得最佳性能,请始终使用原生:
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 解决方案快得多。
【讨论】:
unwrap() 的几乎相同的答案,不记得如何获取文本部分,忘记了.contents() - 非常好。
.replacewith() 相比,它也相当慢,因为额外的 DOM 遍历......如果它是一个只有 HTML 的 <b> 标记,它会变得更快。
parent.removeChild(... 之后添加了parent.normalize() 以合并相邻的文本节点。如果您不断修改页面,这将很有帮助。
你也可以使用.replaceWith(),像这样:
$("b").replaceWith(function() { return $(this).contents(); });
或者如果你知道它只是一个字符串:
$("b").replaceWith(function() { return this.innerHTML; });
如果您要解包很多元素,这可能会产生很大的不同,因为上述任何一种方法的成本都是significantly faster,而不是.unwrap()。
【讨论】:
删除内部 html 元素并仅返回文本的最简单方法是 JQuery .text() function。
例子:
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
【讨论】:
看,最简单的答案令人震惊:
这里是用 javascript 即使没有 jQuery
element.outerHTML = element.innerHTML
使用 jQuery
var element = $('b')[0];
element.outerHTML = element.innerHTML;
或者没有 jQuery
var element = document.querySelector('b');
element.outerHTML = element.innerHTML
如果你想要它作为一个函数:
function unwrap(selector) {
var nodelist = document.querySelectorAll(selector);
Array.prototype.forEach.call(nodelist, function(item,i){
item.outerHTML = item.innerHTML; // or item.innerText if you want to remove all inner html tags
})
}
unwrap('b')
这应该适用于所有主流浏览器,包括旧版 IE。
如果你得到 NoModificationAllowedError 或 DOMException,则表示该元素没有父元素。通常,当您通过从 javascript 控制台创建一个新节点而不将其作为其他元素的子节点来尝试此答案时,您会得到这个。但别担心,请记住,文档中的任何元素都至少有一个父元素(<html></html> 元素)
注意:
这重写了innerHTML,所以如果你有一个引用内部元素的变量,它就不会指向同一个元素。
如果您需要在编码中保留一些内部元素的引用,您可以使用 jQuery(最佳答案)将元素移动到预期位置而无需重写元素。
【讨论】:
NoModificationAllowedError 当您尝试在像document.documentElement 这样的元素上设置outerHTML 时发生,其中元素的父级是Document 本身。 DOMException 当字符串不是有效的 HTML 时出现。见the working draft recommendation。
false。
这个怎么样?
$("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 是选择要定位的元素(第一个示例中的 b 标记)。该功能只是纯JS:D
另请看:
【讨论】:
// For MSIE:
el.removeNode(false);
// Old js, w/o loops, using DocumentFragment:
function replaceWithContents (el) {
if (el.parentElement) {
if (el.childNodes.length) {
var range = document.createRange();
range.selectNodeContents(el);
el.parentNode.replaceChild(range.extractContents(), el);
} else {
el.parentNode.removeChild(el);
}
}
}
// Modern es:
const replaceWithContents = (el) => {
el.replaceWith(...el.childNodes);
};
// or just:
el.replaceWith(...el.childNodes);
// Today (2018) destructuring assignment works a little slower
// Modern es, using DocumentFragment.
// It may be faster than using ...rest
const replaceWithContents = (el) => {
if (el.parentElement) {
if (el.childNodes.length) {
const range = document.createRange();
range.selectNodeContents(el);
el.replaceWith(range.extractContents());
} else {
el.remove();
}
}
};
【讨论】:
另一种原生解决方案(在咖啡中):
el = document.getElementsByTagName 'b'
docFrag = document.createDocumentFragment()
docFrag.appendChild el.firstChild while el.childNodes.length
el.parentNode.replaceChild docFrag, el
我不知道它是否比 user113716 的解决方案更快,但对于某些人来说可能更容易理解。
【讨论】: