emoji-mart(Picker组件)的window.getSelection()问题

时间:2018-10-26 04:59:04

标签: javascript reactjs getcaretpos

我的代码:

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的开头。

如果有人可以帮助我,我将不胜感激!!

1 个答案:

答案 0 :(得分:0)

您可以使用css user-select属性来实现此目的。使用user-select: none;属性为在Picker组件内单击的元素设置样式。

这样,当用户单击Picker组件内的表情符号时,插入标记的位置或文本选择将保持在您将其保留在contentEditable div上的位置。

请务必检查兼容性,以使其在不同的浏览器中正常运行: https://developer.mozilla.org/en-US/docs/Web/CSS/user-select