Удалить выделение, добавленное к выделенному тексту с помощью JavaScript? - PullRequest
2 голосов
/ 10 ноября 2011

Я выделил выделенный текст, используя JavaScript со следующим кодом:

var sel = window.getSelection();
if(!sel.isCollapsed) {
    var range = sel.getRangeAt(0);
    sel.removeAllRanges();
    document.designMode = "on";
    sel.addRange(range);
    document.execCommand("HiliteColor", false, "#ffffcc");
    sel.removeAllRanges();
    document.designMode = "off";
}

Как мне тогда удалить выделенный цвет и восстановить текст?

Ответы [ 3 ]

7 голосов
/ 12 ноября 2011

Вот код для добавления и удаления бликов.Это слишком долго, чтобы публиковать здесь практически, поэтому я сделал демо и разместил фрагмент ниже.Это не совсем идеально, потому что функция unhighlight() не удаляет <span> элементы, вставленные командой выделения, но с небольшой осторожностью это было бы возможным добавлением.

Демонстрация в реальном времени: http://jsfiddle.net/timdown/Bvd9d/

Фрагмент кода:

function unhighlight(node, colour) {
    if (!(colour instanceof Colour)) {
        colour = new Colour(colour);
    }

    if (node.nodeType == 1) {
        var bg = node.style.backgroundColor;
        if (bg && colour.equals(new Colour(bg))) {
            node.style.backgroundColor = "";
        }
    }
    var child = node.firstChild;
    while (child) {
        unhighlight(child, colour);
        child = child.nextSibling;
    }
}
3 голосов
/ 10 ноября 2011

Вместо этого можно использовать CSS:

<style>
    ::selection {background-color: #ffffcc;}
</style>

РЕДАКТИРОВАТЬ: обновить в ответ на комментарии и уточнения

<script type="text/javascript">
    var spans = document.getElementsByTagName('span'), i;
    for( i=0; i<spans.length; i++) {
       if( spans[i].style.backgroundColor == "#ffffcc") {
           // Two alternatives. This:
           spans[i].style.backgroundColor = "transparent";
           // OR this, if spans contain only text:
           spans[i].parentNode.replaceChild(spans[i].firstChild,spans[i]);
           i--;
           // End alternatives - only include i-- in the second one
       }
    }
</script>

Хотя это не работает в некоторых браузерах (я думаю, что это Firefox), гдестиль элемента изменяется на вычисляемый стиль.

0 голосов
/ 10 ноября 2011

Использование

sel.removeAllRanges()
...