我的代码:
addEmoji = () => {
document.getElementById('description-text').focus();
let element = $("#span").clone()[0];
let sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
let range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(element);
let textNode = document.createTextNode('\u00A0');
range.setStartAfter(element);
range.insertNode(textNode);
range.setStartAfter(textNode);
range.collapse(true);
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
}
render() {
return (
<div>
<form onSubmit={this.onSubmit}>
<div id="description-text" ref="description" suppressContentEditableWarning="true" contentEditable={true} />
<div>
<button type="submit">Guardar Cambios</button>
</div>
</form>
<div>
{this.state.emojiPanel ?
<div>
<button type="button" onClick={this.switchEmojiPanel}>Hide Emojis</button>
<Picker onClick={this.addEmoji} set='emojione' emojiSize={26} title="Select Emoji" color="#000" />
<span id="span">INSERT</span>
</div>
:
<div>
<button type="button" onClick={this.switchEmojiPanel}>Select Emojis</button>
</div>
}
</div>
</div>
)
}
问题在于,当用户单击表情符号时尝试在div中插入跨度时,因为我正在从另一个组件调用该函数,所以window.getSelection()无法获取我在div中的位置值。是“选择器”,那么跨度总是插入到div的开头。
如果有人可以帮助我,我将不胜感激!!
答案 0 :(得分:0)
您可以使用css user-select
属性来实现此目的。使用user-select: none;
属性为在Picker组件内单击的元素设置样式。
这样,当用户单击Picker组件内的表情符号时,插入标记的位置或文本选择将保持在您将其保留在contentEditable div上的位置。
请务必检查兼容性,以使其在不同的浏览器中正常运行: https://developer.mozilla.org/en-US/docs/Web/CSS/user-select