问题是您将在此过程中创建无效的 HTML,浏览器将尝试更正。因此,显然当您添加<
or时>
,它会自动对该字符进行编码以不破坏结构。
一个适当的解决方案不会对文本的每个字符都有效,而是会逐个元素地处理 HTML 元素。即,每当您在源 HTML 中遇到一个元素时,您将克隆该元素并将其添加到目标元素。然后,您将逐个字符地处理其文本节点。
这是我一起破解的解决方案(意思是,它可能可以改进很多):
function typeOut(html, target) {
var d = document.createElement('div');
d.innerHTML = html;
var source = d.firstChild;
var i = 0;
(function process() {
if (source) {
if (source.nodeType === 3) { // process text node
if (i === 0) { // create new text node
target = target.appendChild(document.createTextNode(''));
target.nodeValue = source.nodeValue.charAt(i++);
// stop and continue to next node
} else if (i === source.nodeValue.length) {
if (source.nextSibling) {
source = source.nextSibling;
target = target.parentNode;
}
else {
source = source.parentNode.nextSibling;
target = target.parentNode.parentNode;
}
i = 0;
} else { // add to text node
target.nodeValue += source.nodeValue.charAt(i++);
}
} else if (source.nodeType === 1) { // clone element node
var clone = source.cloneNode();
clone.innerHTML = '';
target.appendChild(clone);
if (source.firstChild) {
source = source.firstChild;
target = clone;
} else {
source = source.nextSibling;
}
}
setTimeout(process, 20);
}
}());
}
演示