Проблема с window.getselection () с emoji-mart (компонент picker)

Мой код:

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.

Если бы кто-то мог мне с этим помочь, я был бы очень признателен !!

Было бы лучше, если бы вы скопировали / вставили свой код

Hooman Bahreini 26.10.2018 07:12
2
1
470
1

Ответы 1

Для этого вы можете использовать свойство css user-select. Стилизуйте элементы, которые вы нажимаете внутри компонента Picker, с помощью свойства user-select: none;.

Таким образом, когда пользователь щелкает смайлик внутри компонента Picker, позиция курсора или выделенный текст останутся там, где вы оставили его в своем div contentEditable.

Обязательно проверьте совместимость, чтобы это работало правильно в разных браузерах: https://developer.mozilla.org/en-US/docs/Web/CSS/user-select

Другие вопросы по теме