Jak wyłączyć zaznaczanie tekstu za pomocą jQuery?

198

Czy jQuery lub jQuery-UI ma jakąkolwiek funkcjonalność, która wyłącza zaznaczanie tekstu dla danych elementów dokumentu?

Dawid Ohia
źródło
@John: Czy powyższy link odpowiada na twoje pytanie? Jeśli tak się nie stanie, możesz podać bardziej szczegółowe informacje na temat tego, jak wygląda Twoja sytuacja.
Jørn Schou-Rode
1
Tak. Ale chociaż odpowiedź jest taka sama, to pytanie jest bardzo szczegółowe, więc wielu może przegapić tę odpowiedź, mając na uwadze bardziej ogólne pytanie (tak jak ja).
Dawid Ohia,
@Jhon: Drugie pytanie ma również rozwiązanie jQuery.
Omar Abid

Odpowiedzi:

274

W jQuery 1.8 można to zrobić w następujący sposób:

(function($){
    $.fn.disableSelection = function() {
        return this
                 .attr('unselectable', 'on')
                 .css('user-select', 'none')
                 .on('selectstart', false);
    };
})(jQuery);
SLaks
źródło
1
Alternatywa JavaScript działa tylko dla IE. „onselectstart” nie jest dostępny dla innych przeglądarek
Omar Abid
13
@Omar: Jestem tego świadomy.
SLaks,
11
Dzięki za to. Pracowałem nad suwakiem przeciągania i potrzebowałem sposobu, aby tekst nie był zaznaczany w tym procesie.
Spencer Ruport
35
Dla tych z was, którzy mówią „po prostu nie róbcie”, aby wyłączyć zaznaczanie tekstu (lub cokolwiek innego na SO w tej sprawie), otwórzcie nieco swoje umysły. Często ludzie wyłączają go ze względów estetycznych, takich jak unikanie zaznaczania tekstu podwójnym kliknięciem etykiety z tekstem itp. Więc albo odpowiedz na pytanie, albo podaj rzeczywisty kontrapunkt i określ, o czym mówisz, negując, nie po prostu zarysuj pomysł w ogólny sposób.
dudewad
102

Jeśli używasz jQuery UI, istnieje na to metoda, ale może ona obsłużyć tylko zaznaczanie myszką (tzn. CTRL+ ANadal działa):

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

Kod jest naprawdę prosty, jeśli nie chcesz używać interfejsu jQuery:

$(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; });
Damien
źródło
1
funkcja interfejsu użytkownika jquery byłaby świetna, ale nie zapewnia tego samego poziomu ochrony, nie zapobiega wybieraniu rzeczy bezpośrednio, ale jeśli przenosisz zaznaczenie z innego obiektu dom, potrzebujesz również reguł css - oto funkcja = function () {return this.bind (($ .support.selectstart? "selectstart": "mousedown") + ".ui-disableSelection", function (event) {event.preventDefault ();}); }
chrismarx
2
Zauważ, że disableSelection () jest przestarzałe w jQuery UI 1.9
mar10
Może również wymagać .on ('mousedown', false) do działania, w zależności od przeglądarki. Jednak domyślnie zabijanie zdarzeń zepsutych jest niebezpieczne, ponieważ prawdopodobnie mogłoby to zahamować istniejącą funkcjonalność
Dan.
1
Arg. To denerwujące, że zostało amortyzowane. Jest mnóstwo czasu, kiedy chcesz tego legalnie.
Chuck Le Butt,
Tworzę menu kontekstowe prawym przyciskiem myszy na niektórych tekstach zakotwiczenia i nie chcę, aby tekst był zaznaczany po kliknięciu. Więc tak, @Monk, można by to uznać za uzasadniony przykład.
Wayne Smallman
75

Uważam, że ta odpowiedź ( Zapobiegaj podświetlaniu tabeli tekstowej ) jest najbardziej pomocna i być może można ją połączyć z innym sposobem zapewnienia zgodności z IE.

#yourTable
{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
}
Plynx
źródło
Chrome używa opcji -webkit-user-select
tim
3
Zawsze doceniaj sposób CSS do robienia rzeczy zamiast korzystania z jQuery lub JS w ogóle. Podobnie jak animacje jQuery kontra przejścia CSS, sposób wbudowany w przeglądarkę zawsze będzie najlepszy i najbardziej wydajny.
Brian Leishman
17

Oto bardziej kompleksowe rozwiązanie wyboru rozłączania i anulowania niektórych skrótów klawiszowych (takich jak Ctrl+ ai Ctrl+ c. Test: Cmd + ai 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);

i zadzwoń do przykładu:

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

jsfiddle.net/JBxnQ/

Może to również nie wystarczyć dla starych wersji FireFox (nie wiem, które). Jeśli to wszystko nie działa, dodaj:

.on('mousedown', false)
Vladimir
źródło
3
Dlaczego dzwonisz attr('unselectable', 'on')dwa razy? Czy to literówka, czy jest przydatne?
KajMagnus
Działa to dla mnie świetnie, ale musiałem wyłączyć opcję „.each (function () {$ (this) .attr ('unselectable', 'on') .bind ('selectstart', function () {return false;} );}); " Sekcja dla mojej konkretnej aplikacji internetowej (jQuery Mobile), tylko w przypadku pomaga nikomu ..
Anthony
13

Poniższe polecenie wyłączyłoby zaznaczenie „elementu” wszystkich klas we wszystkich popularnych przeglądarkach (IE, Chrome, Mozilla, Opera i Safari):

$(".item")
        .attr('unselectable', 'on')
        .css({
            'user-select': 'none',
            'MozUserSelect': 'none'
        })
        .on('selectstart', false)
        .on('mousedown', false);
Arvid Vermote
źródło
1
Nie skomplikowane - doskonale! Dziękuję Ci. Dla osób niepełnosprawnych; Dodałem .attr („wyłączone”, „wyłączone”)
freewill
Aktualizacja: zamiast .attr („wyłączone”, „wyłączone”) użyłem .attr („tylko do odczytu”, „tylko do odczytu”). Wyłączone uniemożliwia opublikowanie mojej zmiennej modelu w MVC (zmienna modelu ma wartość NULL). Tylko do odczytu nadal wyłączyłem wyszukiwanie (używam bootstrapu) i pozwala on na opublikowanie wartości przedmiotu
freewill
Znakomity stary, używam tego kodu do zastąpienia „zdarzenia-wskaźnik: brak;”, które nie działają w IE 11. pozdrowienia
Shortys Oberto Dutari
8
        $(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");
        });
Łowca jeleni
źródło
Czy oprócz kodu możesz napisać krótkie streszczenie odpowiedzi?
jonsca
6

Można to łatwo zrobić za pomocą JavaScript. Dotyczy to wszystkich przeglądarek

<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>

Zadzwoń do tej funkcji

<script type="text/javascript">
   disableSelection(document.body)
</script>
Code Spy
źródło
Ten jest świetny! Ale jak zatrzymać na tym „skupienie”?
mutaniczny
3
Ta odpowiedź jest nieaktualna do 2013 r.
Dan
6

To jest naprawdę bardzo proste. Aby wyłączyć zaznaczanie tekstu (a także kliknąć + przeciąganie tekstu (np. Link w Chrome)), wystarczy użyć następującego kodu jQuery:

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

Wszystko to zapobiega domyślnemu działaniu po kliknięciu myszą ( mousedown()) w tagach bodyi html. Można bardzo łatwo zmienić element po prostu zmieniając tekst w między dwoma cytatami (np zmianę $('body, html')do $('#myUnselectableDiv')aby myUnselectableDivdiv być, dobrze, Nie można wybrać.

Krótki urywek, który Ci to pokaże / udowodni:

$('#no-select').mousedown(function(event) {
  event.preventDefault();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/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>

Należy pamiętać, że ten efekt nie jest doskonały i działa najlepiej, a jednocześnie nie można wybrać całego okna. Możesz także dodać

anulowanie niektórych skrótów klawiszowych (takich jak Ctrl+ai Ctrl+c. Test: Cmd+a i Cmd+c)

również korzystając z powyższej części odpowiedzi Vladimira. (przejdź do jego posta tutaj )

Zach Barham
źródło
1

1-liniowe rozwiązanie dla CHROME:

body.style.webkitUserSelect = "none";

i FF:

body.style.MozUserSelect = "none";

IE wymaga ustawienia atrybutu „nie można wybrać” (szczegóły na dole).

Przetestowałem to w Chrome i działa. Ta właściwość jest dziedziczona, więc ustawienie jej w elemencie body spowoduje wyłączenie zaznaczenia w całym dokumencie.

Szczegóły tutaj: http://help.dottoro.com/ljrlukea.php

Jeśli używasz Closure, po prostu wywołaj tę funkcję:

goog.style.setUnselectable(myElement, true);

Obsługuje wszystkie przeglądarki w przejrzysty sposób.

Przeglądarki inne niż IE są obsługiwane w następujący sposób:

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

Zdefiniowane tutaj: http://closure-library.googlecode.com/svn/!svn/bc/4/trunk/closure/goog/docs/closure_goog_style_style.js.source.html

Część IE jest obsługiwana w następujący sposób:

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);
  }
}
użytkownik 1415855
źródło
1

Myślę, że ten kod działa we wszystkich przeglądarkach i wymaga najmniejszego obciążenia. To naprawdę hybryda wszystkich powyższych odpowiedzi. Daj mi znać, jeśli znajdziesz błąd!

Dodaj 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;}

Dodaj jQuery:

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

Opcjonalne: Aby wyłączyć zaznaczanie również dla wszystkich elementów potomnych, możesz zmienić blok IE na:

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

Stosowanie:

$('.someclasshere').disableSelection();
Justin
źródło
1

Wypróbowałem wszystkie podejścia, a ten jest dla mnie najprostszy, ponieważ używam IWebBrowser2 i nie mam 10 przeglądarek, z którymi mogę się zmagać:

document.onselectstart = new Function('return false;');

Działa idealnie dla mnie!

Dave
źródło
0

Jednym z rozwiązań tego problemu, w odpowiednich przypadkach, jest użycie <button>tekstu, którego nie chcesz wybierać. Jeśli wiążesz clickzdarzenie z jakimś blokiem tekstu i nie chcesz, aby ten tekst był możliwy do wybrania, zmiana go na przycisk poprawi semantykę, a także uniemożliwi zaznaczenie tekstu.

<button>Text Here</button>
Nigel B. Peck
źródło
-1

Najlepszy i najprostszy sposób, w jaki go znalazłem, zapobiega naciśnięciu klawiszy Ctrl + C, kliknięciu prawym przyciskiem myszy. W tym przypadku wszystko zablokowałem, więc nie muszę niczego określać.

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});
Marcelo Rocha
źródło