Как отключить выделение текста с помощью jQuery?

188

Имеет ли jQuery или jQuery-UI какие-либо функции для отключения выбора текста для данных элементов документа?

  • 3
    Возможный дубликат: stackoverflow.com/questions/1319126/prevent-highlight-of-text
  • 0
    @John: Ссылка выше отвечает на ваш вопрос? Если этого не произойдет, вы можете добавить более подробную информацию о том, как ваша ситуация отличается.
Показать ещё 2 комментария

12 ответов

263
Лучший ответ

В jQuery 1.8 это можно сделать следующим образом:

(function($){
    $.fn.disableSelection = function() {
        return this
                 .attr('unselectable', 'on')
                 .css('user-select', 'none')
                 .on('selectstart', false);
    };
})(jQuery);
  • 1
    Альтернатива JavaScript работает только для IE. "onselectstart" не доступен для других браузеров
  • 13
    @ Омар: я хорошо это знаю.
Показать ещё 18 комментариев
103

Если вы используете jQuery UI, для этого есть метод, но он может обрабатывать только выбор мыши (т.е. CTRL + A все еще работает):

$('.your-element').disableSelection(); // deprecated in jQuery UI 1.9

Код очень простой, если вы не хотите использовать jQuery UI:

$(el).attr('unselectable','on')
     .css({'-moz-user-select':'-moz-none',
           '-moz-user-select':'none',
           '-o-user-select':'none',
           '-khtml-user-select':'none', /* you could also put this in a class */
           '-webkit-user-select':'none',/* and add the CSS class here instead */
           '-ms-user-select':'none',
           'user-select':'none'
     }).bind('selectstart', function(){ return false; });
  • 1
    функция jquery ui была бы хороша, но она не обеспечивает такой же уровень защиты, она не позволяет выбирать вещи напрямую, но если вы переносите выбор из другого объекта dom, вам также нужны правила css - вот функция = function () {return this.bind (($ .support.selectstart? "selectstart": "mousedown") + ".ui-disableSelection", function (event) {event.preventDefault ();}); }
  • 2
    +1 за второе решение без jquery ui
Показать ещё 5 комментариев
71

Я нашел этот ответ (Предотвратить выделение текстовой таблицы), что наиболее полезно, и, возможно, его можно комбинировать с другим способом обеспечения совместимости IE.

#yourTable
{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
}
  • 0
    Chrome использует -webkit-user-select
  • 2
    Всегда цените способ CSS делать вещи вместо использования jQuery или JS в целом. Так же, как анимации jQuery и CSS-переходы, встроенный в браузер способ всегда будет самым лучшим и эффективным.
Показать ещё 1 комментарий
15

Здесь представлено более комплексное решение для выбора разъединения и отмены некоторых горячих клавиш (например, Ctrl + a и Ctrl + c. Тест: Cmd + a и Cmd + c)

(function($){

  $.fn.ctrlCmd = function(key) {

    var allowDefault = true;

    if (!$.isArray(key)) {
       key = [key];
    }

    return this.keydown(function(e) {
        for (var i = 0, l = key.length; i < l; i++) {
            if(e.keyCode === key[i].toUpperCase().charCodeAt(0) && e.metaKey) {
                allowDefault = false;
            }
        };
        return allowDefault;
    });
};


$.fn.disableSelection = function() {

    this.ctrlCmd(['a', 'c']);

    return this.attr('unselectable', 'on')
               .css({'-moz-user-select':'-moz-none',
                     '-moz-user-select':'none',
                     '-o-user-select':'none',
                     '-khtml-user-select':'none',
                     '-webkit-user-select':'none',
                     '-ms-user-select':'none',
                     'user-select':'none'})
               .bind('selectstart', false);
};

})(jQuery);

и пример вызова:

$(':not(input,select,textarea)').disableSelection();

jsfiddle.net/JBxnQ/

Этого также может быть недостаточно для старых версий FireFox (я не могу сказать, какой). Если все это не работает, добавьте следующее:

.on('mousedown', false)
  • 3
    Почему вы вызываете attr('unselectable', 'on') дважды? Это опечатка или она полезна?
  • 0
    Это прекрасно сработало для меня, но мне пришлось отключить ".each (function () {$ (this) .attr ('unselectable', 'on') .bind ('selectstart', function () {return false;} );}); " раздел для моего конкретного веб-приложения (JQuery Mobile), на всякий случай, если это кому-нибудь поможет ..
11

Следующее приведет к отключению выбора элемента всех классов во всех распространенных браузерах (IE, Chrome, Mozilla, Opera и Safari):

$(".item")
        .attr('unselectable', 'on')
        .css({
            'user-select': 'none',
            'MozUserSelect': 'none'
        })
        .on('selectstart', false)
        .on('mousedown', false);
  • 1
    Не сложно - отлично! Спасибо. Для инвалидов; Я добавил .attr («отключен», «отключен»)
  • 0
    Обновление: вместо .attr («отключен», «отключен»), я использовал .attr («только для чтения», «только для чтения»). Отключено предотвращает публикацию моей переменной модели в MVC (переменная модели равна нулю). Readonly по-прежнему отключен поиск (я использую bootstrap), и это позволяет опубликовать значение элемента
Показать ещё 1 комментарий
7
        $(document).ready(function(){
            $("body").css("-webkit-user-select","none");
            $("body").css("-moz-user-select","none");
            $("body").css("-ms-user-select","none");
            $("body").css("-o-user-select","none");
            $("body").css("user-select","none");
        });
  • 0
    Не могли бы вы написать краткое резюме ответа в дополнение к коду?
6

Это легко сделать с помощью JavaScript. Это применимо ко всем браузерам

<script type="text/javascript">

/***********************************************
* Disable Text Selection script-  Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/

function disableSelection(target){
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false}
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox
    target.style.MozUserSelect="none"
else //All other route (For Opera)
    target.onmousedown=function(){return false}
target.style.cursor = "default"
}
 </script>

Вызов этой функции

<script type="text/javascript">
   disableSelection(document.body)
</script>
  • 0
    Это здорово! Но как нам остановить «фокус» на этом?
  • 3
    Этот ответ устарел к 2013 году
4

Это на самом деле очень просто. Чтобы отключить выбор текста (а также нажмите + перетащить текст (например, ссылку в Chrome)), просто используйте следующий код jQuery:

$('body, html').mousedown(function(event) {
    event.preventDefault();
});

Все это предотвращает дефолт, когда вы нажимаете мышью (mousedown()) в тегах body и html. Вы можете очень легко изменить элемент, просто изменив текст между двумя кавычками (например, измените $('body, html') на $('#myUnselectableDiv'), чтобы сделать myUnselectableDiv div, ну, не поддающимся выбору.

Быстрый фрагмент, чтобы показать/доказать это вам:

$('#no-select').mousedown(function(event) {
  event.preventDefault();
});
<script src="/jquery.min.js"></script>
<span id="no-select">I bet you can't select this text, or drag <a href="#">this link</a>, </span>
<br/><span>but that you can select this text, and drag <a href="#">this link</a>!</span>

Обратите внимание, что этот эффект не идеален и работает лучше всего, делая невозможным выбор всего окна. Вы также можете добавить

отмена некоторых горячих клавиш (например, Ctrl+a и Ctrl+c. Тест: Cmd+a и Cmd+c)

используя этот раздел ответа Владимира выше. (см. его сообщение здесь)

1

Я думаю, что этот код работает во всех браузерах и требует наименьших издержек. Это действительно гибрид всех вышеперечисленных ответов. Дайте мне знать, если найдете ошибку!

Добавить CSS:

.no_select { user-select: none; -o-user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -ms-user-select:none;}

Добавить jQuery:

(function($){
    $.fn.disableSelection = function() 
    {       
        $(this).addClass('no_select');              
        if($.browser.msie)
        {
            $(this).attr('unselectable', 'on').on('selectstart', false);            
        }
    return this;            
};
})(jQuery);

Необязательно: Чтобы отключить выбор для всех дочерних элементов, вы можете изменить блок IE на:

$(this).each(function() {
    $(this).attr('unselectable','on')
    .bind('selectstart',function(){ return false; });
});

Применение:

$('.someclasshere').disableSelection();
1

1 линейное решение для CHROME:

body.style.webkitUserSelect = "none";

и FF:

body.style.MozUserSelect = "none";

IE требует установки атрибута "unselectable" (подробности внизу).

Я тестировал это в Chrome, и он работает. Это свойство наследуется, поэтому установка его на элемент body отключит выделение во всем документе.

Подробности здесь: http://help.dottoro.com/ljrlukea.php

Если вы используете Closure, просто вызовите эту функцию:

goog.style.setUnselectable(myElement, true);

Он прозрачно обрабатывает все браузеры.

Не-IE-браузеры обрабатываются следующим образом:

goog.style.unselectableStyle_ =
    goog.userAgent.GECKO ? 'MozUserSelect' :
    goog.userAgent.WEBKIT ? 'WebkitUserSelect' :
    null;

Определено здесь: http://closure-library.googlecode.com/svn/!svn/bc/4/trunk/closure/goog/docs/closure_goog_style_style.js.source.html

Часть IE обрабатывается следующим образом:

if (goog.userAgent.IE || goog.userAgent.OPERA) {
// Toggle the 'unselectable' attribute on the element and its descendants.
var value = unselectable ? 'on' : '';
el.setAttribute('unselectable', value);
if (descendants) {
  for (var i = 0, descendant; descendant = descendants[i]; i++) {
    descendant.setAttribute('unselectable', value);
  }
}
0

Одним из решений этого для соответствующих случаев является использование <button> для текста, который вы не хотите выбирать. Если вы привязываетесь к событию click в каком-либо текстовом блоке и не хотите, чтобы этот текст можно было выбрать, изменение его как кнопки приведет к улучшению семантики, а также к предотвращению выбора текста.

<button>Text Here</button>
-1

Лучший и самый простой способ, которым я его нашел, предотвращает ctrl + c, щелчок правой кнопкой мыши. В этом случае я заблокировал все, поэтому мне не нужно ничего указывать.

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню