問題は、その過程で無効な HTML が作成され、ブラウザが修正しようとすることです。どうやら<
orを追加>
すると、構造を壊さないようにその文字が自動的にエンコードされます。
適切な解決策は、テキストのすべての文字で文字通り機能するわけではありませんが、HTML 要素を要素ごとに処理します。つまり、ソース HTML で要素に遭遇するたびに、その要素を複製してターゲット要素に追加します。次に、そのテキスト ノードを 1 文字ずつ処理します。
これが私が一緒にハッキングした解決策です(つまり、おそらく大幅に改善される可能性があります):
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);
}
}());
}
デモ