Rangy applyToSelection на курсоре, если выбранный диапазон пуст?

Это похоже на глупый вопрос.

Я использую отличную библиотеку Rangy в javascript для применения классов CSS из раскрывающегося списка к выделенному тексту, как если бы в редакторе форматированного текста.

Но если пользователь просто набирает текст, не делая выбора, и применяет класс через раскрывающийся список, «applyToSelection» rangy ничего не делает, поскольку, по-видимому, это пустой диапазон.

Я знаю, что есть сложные способы добавить правильный div в выбранное местоположение курсора и войти в него, но, прежде чем я приступлю к ним, я упустил простой способ сделать это, используя Rangy или обычный JS?

Спасибо!


person JBlitzen    schedule 17.01.2015    source источник


Ответы (1)


Вот код, который у меня получился, который отлично работал в IE11, но еще не тестировался в других браузерах:

        var actual_textarea = document.getElementById("my_input_textarea");
        actual_textarea.focus();
        var selectedInstance = this.ne.selectedInstance;
        var range = selection.getRangeAt(0);
        range.deleteContents();
        var new_div = document.createElement("div");
        new_div.innerHTML = "<div class='" + this.rangyClassPrefix + elm + "'></div>";
        var frag = document.createDocumentFragment();
        var node, lastNode;
        while (node = new_div.firstChild)
        {
            lastNode = frag.appendChild(node);
        }   
        range.insertNode(frag);
        if (lastNode)
        {
            range = range.cloneRange();

            range.selectNodeContents(lastNode);
            range.collapse(false);
            selection.removeAllRanges();
            selection.addRange(range);
        }

Обратите внимание, что сначала я устанавливаю фокус, поскольку стиль применяется путем изменения фокуса щелчками по другим элементам.

Я все еще немного смущен мыслью о том, что клоны диапазона являются ценными, а не эталонными клонами, но все еще отлично работают при добавлении, поскольку это нелогично, но это работает.

Спасибо!

person JBlitzen    schedule 18.01.2015