¿Cómo deshabilitar la selección de texto usando jQuery?

198

¿Tiene jQuery o jQuery-UI alguna funcionalidad para deshabilitar la selección de texto para elementos de documento dados?

Dawid Ohia
fuente
@ John: ¿El enlace de arriba responde a tu pregunta? Si no es así, es posible que desee agregar más detalles sobre cómo su situación es diferente.
Jørn Schou-Rode
1
Si lo hace Pero aunque la respuesta es la misma, esa pregunta es muy específica, por lo que muchos pueden perder esa respuesta teniendo en cuenta una pregunta más general (como lo hice).
Dawid Ohia
@Jhon: La otra pregunta también tiene una solución jQuery.
Omar Abid

Respuestas:

274

En jQuery 1.8, esto se puede hacer de la siguiente manera:

(function($){
    $.fn.disableSelection = function() {
        return this
                 .attr('unselectable', 'on')
                 .css('user-select', 'none')
                 .on('selectstart', false);
    };
})(jQuery);
SLaks
fuente
1
La alternativa de JavaScript solo funciona para IE. "onselectstart" no está disponible para otros navegadores
Omar Abid
13
@ Omar: Soy muy consciente de eso.
SLaks
11
Gracias por esto. Estaba trabajando en un control deslizante de arrastre y necesitaba una forma en que el texto no fuera seleccionado en el proceso.
Spencer Ruport
35
Para aquellos de ustedes que dicen "simplemente no" a deshabilitar la selección de texto (o cualquier otra cosa en SO para el caso), abran sus mentes un poco. Muchas veces las personas lo deshabilitan por razones estéticas, como evitar la selección de texto con un doble clic en una etiqueta con texto, etc. Entonces, responda la pregunta o proporcione un contrapunto real y especifique de qué está hablando negar, no No descarte la idea de manera general.
dudewad
102

Si usa jQuery UI, hay un método para eso, pero solo puede manejar la selección del mouse (es decir, CTRL+ Asigue funcionando):

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

El código es realmente simple, si no quieres usar 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; });
Damien
fuente
1
la función jquery ui sería excelente, pero no ofrece el mismo nivel de protección, evita seleccionar cosas directamente, pero si lleva una selección de otro objeto dom, también necesita las reglas css: aquí está la función = function () {return this.bind (($ .support.selectstart? "selectstart": "mousedown") + ".ui-disableSelection", function (event) {event.preventDefault ();}); }
chrismarx
2
Tenga en cuenta que disableSelection () está en desuso en jQuery UI 1.9
mar10
También podría requerir .on ('mousedown', false) para funcionar, dependiendo de su navegador. Sin embargo, es peligroso matar los eventos de mousedown de forma predeterminada porque esto probablemente podría frenar la funcionalidad existente
Dan
1
Arg. Es molesto que se haya depreciado. Hay mucho tiempo cuando quieres esto legítimamente.
Chuck Le Butt
Estoy creando un menú contextual con el botón derecho en algún texto de anclaje, y no quiero que el texto se seleccione al hacer clic. Entonces sí, @Monk, esto calificaría como un ejemplo legítimo.
Wayne Smallman
75

Encontré esta respuesta ( Prevenir el resaltado de la tabla de texto ) más útil, y tal vez se pueda combinar con otra forma de proporcionar compatibilidad con IE.

#yourTable
{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
}
Plynx
fuente
Chrome utiliza -webkit-user-select
tim
3
Siempre aprecie la forma CSS de hacer cosas en lugar de usar jQuery o JS en general. Al igual que las animaciones jQuery frente a las transiciones CSS, la forma integrada en el navegador siempre será la mejor y la más eficiente.
Brian Leishman
17

Aquí hay una solución más completa para la selección de desconexión y la cancelación de algunas de las teclas de acceso rápido (como Ctrl+ ay Ctrl+ c. Prueba: Cmd + ay 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);

y ejemplo de llamada:

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

jsfiddle.net/JBxnQ/

Esto también podría no ser suficiente para las versiones antiguas de FireFox (no puedo decir cuál). Si todo esto no funciona, agregue lo siguiente:

.on('mousedown', false)
Vladimir
fuente
3
¿Por qué llamas attr('unselectable', 'on')dos veces? ¿Es un error tipográfico o es útil?
KajMagnus
Esto funcionó muy bien para mí, pero tuve que deshabilitar el ".each (function () {$ (this) .attr ('unselectable', 'on') .bind ('selectstart', function () {return false;} );}); " sección para mi aplicación web particular (JQuery Mobile), en caso de que ayude a alguien ..
Anthony
13

Lo siguiente deshabilitaría la selección del 'elemento' de todas las clases en todos los navegadores comunes (IE, Chrome, Mozilla, Opera y Safari):

$(".item")
        .attr('unselectable', 'on')
        .css({
            'user-select': 'none',
            'MozUserSelect': 'none'
        })
        .on('selectstart', false)
        .on('mousedown', false);
Arvid Vermote
fuente
1
No es complicado, ¡excelente! Gracias. Para personas con discapacidad; Agregué .attr ('disabled', 'disabled')
libre albedrío el
Actualización: en lugar de .attr ('disabled', 'disabled'), utilicé .attr ('readonly', 'readonly'). Deshabilitado impide publicar mi variable de modelo en MVC (la variable de modelo es nula). Readonly todavía tiene deshabilitado el aspecto (uso bootstrap) y permite publicar el valor del artículo
libre albedrío
Excelente hermano, estoy usando este código para reemplazar "pointer-events: none;", que no funciona en IE 11. saludos
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");
        });
cazador de ciervos
fuente
¿Podría escribir un breve resumen de la respuesta además del código?
jonsca
6

Esto se puede hacer fácilmente usando JavaScript. Esto es aplicable a todos los navegadores.

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

Llamar a esta función

<script type="text/javascript">
   disableSelection(document.body)
</script>
Code Spy
fuente
Este es genial! Pero, ¿cómo detenemos el "enfoque" en él?
mutanico
3
Esta respuesta no está actualizada en 2013
Dan
6

Esto es realmente muy simple. Para deshabilitar la selección de texto (y también hacer clic + arrastrar texto (por ejemplo, un enlace en Chrome)), solo use el siguiente código jQuery:

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

Todo esto hace que evite que ocurra el valor predeterminado cuando hace clic con el mouse ( mousedown()) en las etiquetas bodyy html. Puede cambiar fácilmente el elemento simplemente cambiando el texto entre las dos citas (por ejemplo, cambiar $('body, html')a $('#myUnselectableDiv')para que el myUnselectableDivdiv sea, bueno, no seleccionable.

Un fragmento rápido para mostrar / probar esto:

$('#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>

Tenga en cuenta que este efecto no es perfecto y funciona mejor mientras hace que no se pueda seleccionar toda la ventana. Es posible que también desee agregar

la cancelación de algunas de las teclas de acceso rápido (como Ctrl+ay Ctrl+c. Prueba: Cmd+a y Cmd+c)

también, al usar esa sección de la respuesta de Vladimir anterior. (llegar a su publicación aquí )

Zach Barham
fuente
1

Solución de 1 línea para CROMO:

body.style.webkitUserSelect = "none";

y FF:

body.style.MozUserSelect = "none";

IE requiere establecer el atributo "no seleccionable" (detalles en la parte inferior).

Probé esto en Chrome y funciona. Esta propiedad se hereda, por lo que establecerla en el elemento body deshabilitará la selección en todo el documento.

Detalles aquí: http://help.dottoro.com/ljrlukea.php

Si está utilizando Closure, simplemente llame a esta función:

goog.style.setUnselectable(myElement, true);

Maneja todos los navegadores de manera transparente.

Los navegadores que no son IE se manejan así:

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

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

La porción IE se maneja así:

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);
  }
}
usuario1415855
fuente
1

Creo que este código funciona en todos los navegadores y requiere la menor sobrecarga. Es realmente un híbrido de todas las respuestas anteriores. ¡Avísame si encuentras un error!

Añadir 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;}

Añadir jQuery:

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

Opcional: para deshabilitar la selección de todos los elementos secundarios también, puede cambiar el bloque IE a:

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

Uso:

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

He intentado todos los enfoques, y este es el más simple para mí porque estoy usando IWebBrowser2 y no tengo 10 navegadores con los que lidiar:

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

¡Funciona perfectamente para mí!

Dave
fuente
0

Una solución a esto, para los casos apropiados, es usar un <button>para el texto que no desea que se pueda seleccionar. Si está vinculado al clickevento en algún bloque de texto y no desea que ese texto sea seleccionable, cambiarlo para que sea un botón mejorará la semántica y también evitará que se seleccione el texto.

<button>Text Here</button>
Nigel B. Peck
fuente
-1

La mejor y más simple forma en que lo encontré, evita ctrl + c, haga clic derecho. En este caso bloqueé todo, así que no tengo que especificar nada.

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