考虑改用 DOM;你已经有了你想要的结构,所以换掉节点本身(大量借用@maxwell的代码,但也移动孩子):
var elements = document.getElementsByClassName('replace');
for(var i = elements.length-1; i>= 0; --i) {
var element = elements[i];
var newElement = document.createElement('replacetext');
var children = element.childNodes;
for(var ch = 0; ch < children.length; ++i) {
var child = children[ch];
element.removeChild(child);
newElement.appendChild(child);
}
element.parentNode.insertBefore(newElement,element);
element.parentNode.removeChild(element);
}
然后,对于给定类的每个元素,它会将其每个子元素移动到新元素,然后使用该元素的位置插入新元素并最终移除自身。
我唯一的疑问是getElementByClassName对数组返回的item的修改是否会出问题;它可能需要在处理之前额外检查元素是否有效,或者您可能更喜欢将其编写为递归函数并首先从最深的节点处理树。
它可能看起来需要更多的工作,但这应该更快(在你改变它之后不需要重新解析 html,元素移动只是参考值分配)并且更健壮。尝试解析 HTML 可能会损害您的健康。
重读问题(总是一个好计划),你从字符串中的文本开始。如果这确实是起点(即,您不只是将其从 innerHTML 值中提取出来),那么要使用上述内容,只需创建一个临时父元素:
var fosterer = document.createElement('div');
fosterer.innerHTML = text; // your variable from the question
然后继续使用fosterer.getElementsByClassName
.