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



@ 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);

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

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

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)

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

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");
        });

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

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


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

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();

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


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>

-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');
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.