我有一些简单的HTML,我需要去除简单的格式。
A nice house was found in <b>Toronto</b>.
我需要删除粗体,但保持原样。
在jQuery中这怎么可能?
我有一些简单的HTML,我需要去除简单的格式。
A nice house was found in <b>Toronto</b>.
我需要删除粗体,但保持原样。
在jQuery中这怎么可能?
Answers:
$('b').contents().unwrap();
这会选择所有<b>元素,然后将.contents()定位到的文本内容<b>,然后.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解决方案都快得多。
.replacewith()由于有更多的DOM遍历,因此它也相当慢...如果它是<b>仅包含HTML 的标记,它的运行速度甚至更快。
parent.normalize()后,parent.removeChild(...合并相邻的文本节点。如果您不断修改页面,这将很有帮助。
您也可以这样使用.replaceWith():
$("b").replaceWith(function() { return $(this).contents(); });
或者,如果您知道这只是一个字符串:
$("b").replaceWith(function() { return this.innerHTML; });
删除内部html元素并仅返回文本的最简单方法是JQuery .text()函数。
例:
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
这个怎么样?
$("b").insertAdjacentHTML("afterend",$("b").innerHTML);
$("b").parentNode.removeChild($("b"));
第一行将b标记的HTML内容直接复制到标记之后的位置b,然后第二行b从DOM中删除标记,仅保留其复制的内容。
我通常将其包装到一个函数中以使其更易于使用:
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();
}
}
};
最简单的答案就是:
这是即使没有jQuery也可以使用javascript做到的
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在内的所有主要浏览器中使用。在最近的浏览器中,我们甚至可以直接在节点列表上调用forEach。
function unwrap(selector) {
document.querySelectorAll('b').forEach( (item,i) => {
item.outerHTML = item.innerText;
} )
}
unwrap()不记得如何获得文本部分,忘了.contents()-太好了。