Выделите выделенный текст с помощью jquery

#javascript #jquery #selection

#javascript #jquery #выделение

Вопрос:

Когда пользователь выбирает любой текст на моей HTML-странице, я хочу добавить к нему пользовательский стиль (например color:red; ). Это будет действовать как инструмент выделения, аналогичный тому, что вы можете видеть в некоторых приложениях для чтения файлов pdf.

Для этого я объявляю highlight() функцию, которая получает выделенный текст плюс его позицию.

 function highlight(text, x, y) {
        alert(text '***' x '***' y)
        window.getSelection().removeAllRanges();
    }
  

отредактирована ссылка jsfiddle

jsFiddle

Комментарии:

1. Попробуйте плагин Rangy — он предлагает именно то, что вам нужно, с полной кроссбраузерной поддержкой.

Ответ №1:

После некоторых исследований я предлагаю пойти этим путем.

HTML

 <h3 class="foo">hello world! hello world! hello world</h3>
<div class="foo">hello world! hello world hello world!</div>
<span class="foo">hello world! hello world</span>
  

css

 .foo::selection {
    color:#ff0099;
}

.bar::selection {
    color: red;   
}
  

js

 $(document).ready(function(){
    $(".foo").removeClass("foo").addClass("bar");
});
  

скрипка

Сначала добавьте a class в свой элемент, который вы хотите использовать эффект. После использования селектора выбора и с js add помощью и remove classes . Надеюсь, это поможет 🙂

Комментарии:

1. @KristianBarrett это то, о чем просил OP, не так ли? Каким бы элегантным ни было это решение, если вам нужна поддержка <IE9, это не сработает. 1 независимо.

2. Да, но это не будет придерживаться и только раскрасит выделение. Возможно, я неправильно понял, о чем он спрашивал, но я подумал, что это механизм выделения для выделения частей текста, который вы только что прочитали.

3. @RoryMcCrossan Спасибо за ваш комментарий 🙂

4. @alek я хочу, чтобы, когда пользователь выбирал любой текст, я показывал всплывающее окно, чтобы пользователь мог выбрать, какой стиль применяется.

5. @user3760964 Тогда вам нужно будет использовать плагин Rangy, который я упомянул в своем комментарии к вашему вопросу.

Ответ №2:

Вместо этого попробуйте этот подход. Основные шаги — получить выделенный текст, передать его в метод getRangeAt, а затем создать новый элемент span, чтобы окружить выделенный текст и применить ваш атрибут class.

 $(document).on("mouseup", function (e) {
    var selected = getSelection();
    var range = selected.getRangeAt(0);
    if(selected.toString().length > 1){
        var newNode = document.createElement("span");
        newNode.setAttribute("class", "red");
        range.surroundContents(newNode);       
    }
    selected.removeAllRanges();
 });

function getSelection() {
    var seltxt = '';
     if (window.getSelection) { 
         seltxt = window.getSelection(); 
     } else if (document.getSelection) { 
         seltxt = document.getSelection(); 
     } else if (document.selection) { 
         seltxt = document.selection.createRange().text; 
     }
    else return;
    return seltxt;
}
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. 1 Есть предложения, как заставить его работать, если вы выбираете текст из разных div элементов? Потому что это не сработает, если вы это сделаете…

2. @jme11 спасибо, но как можно предоставить этот выбор пользователю, который выбирает, какой стиль применяется ..?

3. я обнаружил проблему, если выделенная область содержит либо <h2> элемент, <div> либо элемент, Либо элемент и т. Д., объявленный стиль не применяется…

4. Для написания чего-то, что позволило бы этому работать с несколькими элементами уровня блока, потребуется гораздо больше. Если вам нужна эта функциональность, я рекомендую этот плагин: mir3z.github.io/jquery.texthighlighter Это единственный, с которым я сталкивался, который справляется с этим сценарием. Что еще лучше, в нем есть методы для настройки цвета выделения.