私のコード:
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 の先頭に挿入されます。
誰かがこれで私を助けることができれば、本当に感謝します!!