表情符号在 contentEditable 中重新渲染后变成问号
Emojis become question marks after re-render in contentEditable
我创建了一个简单的文本编辑器,还创建了添加表情符号的可能性。问题是,当我单击一个表情符号时,表情符号被添加并可见,但之前存在的表情符号被问号替换。我的 contentEditable div 是受控的,这意味着无论何时添加表情符号都会导致重新呈现。我的算法在以下情况下遇到了这个问题:
childValue = childValue.substring(0, caretPosition) + emoji + childValue.substring(caretPosition + 1, childValue.length)
childValue
不是状态变量,它的值用于更新常量变量,该变量将用于更新表示 contentEditable 的 dangerouslySetInnerHTML
属性 的状态变量, caretPosition
完美。
知道我为什么会遇到这个问题吗?
这个来自 的解决方案结合 HTML 转义应该可以解决问题:
var p = document.querySelector("p");
var childValue = "Some sample text";
var caretPosition = 5;
var emoji = "";
const emojiToString = (emoji) =>
` &#x${emoji.codePointAt(0).toString(16)}; `;
childValue =
childValue.substring(0, caretPosition) + emojiToString(emoji) +
childValue.substring(caretPosition, childValue.length);
p.innerHTML = childValue;
<p></p>
我解决了这个问题。我发现 'substring' 把一切都搞砸了,所以我做了以下事情:
newChildValue = Array.from(childValue);
childValue = newChildValue.slice(0, caretPosition).join('') + emoji + newChildValue.slice(caretPosition).join('');
这样我就避免使用 'substring',因为 Array.from(str)
将字符串拆分为单独的 unicode 字符,而不会在字节之间打断它们。
我创建了一个简单的文本编辑器,还创建了添加表情符号的可能性。问题是,当我单击一个表情符号时,表情符号被添加并可见,但之前存在的表情符号被问号替换。我的 contentEditable div 是受控的,这意味着无论何时添加表情符号都会导致重新呈现。我的算法在以下情况下遇到了这个问题:
childValue = childValue.substring(0, caretPosition) + emoji + childValue.substring(caretPosition + 1, childValue.length)
childValue
不是状态变量,它的值用于更新常量变量,该变量将用于更新表示 contentEditable 的 dangerouslySetInnerHTML
属性 的状态变量, caretPosition
完美。
知道我为什么会遇到这个问题吗?
这个来自
var p = document.querySelector("p");
var childValue = "Some sample text";
var caretPosition = 5;
var emoji = "";
const emojiToString = (emoji) =>
` &#x${emoji.codePointAt(0).toString(16)}; `;
childValue =
childValue.substring(0, caretPosition) + emojiToString(emoji) +
childValue.substring(caretPosition, childValue.length);
p.innerHTML = childValue;
<p></p>
我解决了这个问题。我发现 'substring' 把一切都搞砸了,所以我做了以下事情:
newChildValue = Array.from(childValue);
childValue = newChildValue.slice(0, caretPosition).join('') + emoji + newChildValue.slice(caretPosition).join('');
这样我就避免使用 'substring',因为 Array.from(str)
将字符串拆分为单独的 unicode 字符,而不会在字节之间打断它们。