Как расширить выделение до границы слова с помощью JavaScript, только один раз?

Я использую метод, показанный в этом ответе, чтобы расширить выбор веб-страницы до границы слова:

function snapSelectionToWord() {
    var sel;

    // Check for existence of window.getSelection() and that it has a
    // modify() method. IE 9 has both selection APIs but no modify() method.
    if (window.getSelection && (sel = window.getSelection()).modify) {
        sel = window.getSelection();
        if (!sel.isCollapsed) {

            // Detect if selection is backwards
            var range = document.createRange();
            range.setStart(sel.anchorNode, sel.anchorOffset);
            range.setEnd(sel.focusNode, sel.focusOffset);
            var backwards = range.collapsed;
            range.detach();

            // modify() works on the focus of the selection
            var endNode = sel.focusNode, endOffset = sel.focusOffset;
            sel.collapse(sel.anchorNode, sel.anchorOffset);
            if (backwards) {
                sel.modify("move", "forward", "word");
                sel.extend(endNode, endOffset);
                sel.modify("extend", "backward", "word");

            } else {
                sel.modify("move", "backward", "word");
                sel.extend(endNode, endOffset);
                sel.modify("extend", "forward", "word");
            }
        }
    } else if ( (sel = document.selection) && sel.type != "Control") {
        var textRange = sel.createRange();
        if (textRange.text) {
            textRange.expand("word");
            // Move the end back to not include the word's trailing space(s),
            // if necessary
            while (/\s$/.test(textRange.text)) {
                textRange.moveEnd("character", -1);
            }
            textRange.select();
        }
    }
}​

Пока что, очень хорошо. Но если вы вызываете функцию snapSelectionToWordболее одного раза для выделения, она расширяется наружу на одно слово в обоих направлениях при каждом вызове, что не очень хорошо, если вы хотите вызывать ее более одного раза при выделении текста. .

Вот живой пример jsFiddle, который позволяет многократно нажимать кнопку «Snap», что демонстрирует проблему.

Как исправить исходное решение, чтобы оно не расширяло выделение, если оно уже находится на границе слова?

  • Я бы предпочел оставить комментарий к оригинальному решению, но, к сожалению, кармическая бригада StackOverflow еще не удостоила меня достаточной кармы, иначе я бы просто спросил там . И я не уверен, как исправить проблему, поэтому не буду редактировать исходное решение.

Изменить: Добавление фрагмента кода для каждого запроса

7
задан Community 23 May 2017 в 10:29
поделиться