gpt4 book ai didi

javascript - 当我用 标签替换字符串时,MutationObserver 创建无限循环

转载 作者:行者123 更新时间:2023-12-02 19:01:39 24 4
gpt4 key购买 nike

我想用 html contenteditable div 替换所有出现的情况。我需要用标签替换该事件,以使用 css 对其进行自定义。但是当我尝试用跨度替换时,MutationObserver 会生成无限循环......

document.designMode = "on";

var text = document.getElementById('text');

let observer = new MutationObserver(mutations =>
mutations.forEach(mutation => {
console.log(text.textContent);
// let a = "a";
// a.style.color = "red";
text.textContent = text.textContent.replace('/', '<span>/</span>');
observer.disconnect();
const range = document.createRange();
const textNode = text.firstChild;
range.setStart(textNode, text.textContent.length);
range.setEnd(textNode, text.textContent.length);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
// observer.disconnect();
})
);

observer.observe(text, {
childList: true,
characterData: true,
subtree: true,

});

<p id="text" contenteditable="true">I'm a text will be change</p>

最佳答案

无限循环是由替换输入的 / 引起的带有 <span>/</span> 的字符无需先关闭观察器 - 每次替换都会再次触发观察器。

这个问题的解决方案很简单:在更换之前关闭观察器,然后再打开它:

"use strict";
document.designMode = "on";

var text = document.getElementById('text');

let observer = new MutationObserver(mutations =>
mutations.forEach(mutation => {
console.log(text.textContent);
observer.disconnect(); // turn observer off;
text.textContent = text.textContent.replace('/', '<span>/</span>');

const range = document.createRange();
const textNode = text.firstChild;
range.setStart(textNode, text.textContent.length);
range.setEnd(textNode, text.textContent.length);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
observe(); // turn back on
})
);

const observe = ()=> {

observer.observe(text, {
childList: true,
characterData: true,
subtree: true,

});
};
observe();
span { background-color: yellow;}
<p id="text" contenteditable="true">I'm a text will be change</p>

但这只是凸显了一个潜在的新问题:代码替换了 textContent使用 HTML,因为它位于文本节点内,所以以源形式显示,并且因为 <span>/</span>位于文本节点内,用黄色突出显示 SPAN 元素的 CSS 不起作用(它不是 SPAN 元素)。

假设 span 元素应该呈现为 HTML,那么现在的设计问题就变成了如何用 DOM 中的 SPAN 元素(而不是文本节点中的)替换新键入的正斜杠。 mutation.target 突变记录的属性可能是一个很好的起点,可以将其分成三个节点:一个文本节点,用于 / 之前的文本。 , <span>/</span> 的元素节点以及 / 之后的文本的最终文本节点如果有的话,然后根据需要将光标重新定位在跨度节点之后。

关于javascript - 当我用 <span> 标签替换字符串时,MutationObserver 创建无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65484575/

24 4 0