2012-06-28 8 views
17

He visto/escuchado todo sobre la desactivación de la selección de texto con las variaciones de user-select, pero ninguna de ellas funciona para el problema que estoy teniendo. En Android (y supongo que en iPhone), si toca y mantiene presionado el texto, lo resalta y muestra pequeñas banderas para arrastrar y seleccionar texto. Necesito desactivar los (ver imagen):Web móvil - Desactive la selección de texto de toque largo/taphold

screenshot

He intentado -webkit-touch-callout en vano, e incluso intentado cosas como $('body').on('select',function(e){e.preventDefault();return;}); en vano. Y los trucos baratos como ::selection:rgba(0,0,0,0); tampoco funcionarán, ya que ocultarlos no ayudará, la selección aún ocurre e interrumpe la IU. Además, supongo que esas banderas todavía estarían allí.

Cualquier idea sería genial. ¡Gracias!

+0

Hmmm. El Fiddle parecía funcionar cuando lo probé en mi teléfono, pero no estoy 100% seguro de que funcione para mí en producción. Todavía necesito poder activar eventos (notablemente, 'touchstart',' touchmove', y 'touchend') en los elementos. Aunque, teniendo en cuenta que esto solo está actuando en 'select'tart', podríamos ser buenos. Lo probaré esta noche y te responderé :) –

Respuesta

14

Referencia:

jsFiddle Demo with Plugin

Lo anterior jsFiddle demo que hizo utiliza un plugin para permitirle prevenir cualquier bloque de texto que se seleccione en Android o iOS dispositivos (junto con los navegadores de escritorio también).

Es fácil de usar y aquí está el marcado de muestra una vez que se instala el plugin jQuery.

HTML de ejemplo: jQuery

<p class="notSelectable">This text is not selectable</p> 

<p> This text is selectable</p> 

muestra: código

$(document).ready(function(){ 

    $('.notSelectable').disableSelection(); 

}); 

Plugin:

$.fn.extend({ 
    disableSelection: function() { 
     this.each(function() { 
      this.onselectstart = function() { 
       return false; 
      }; 
      this.unselectable = "on"; 
      $(this).css('-moz-user-select', 'none'); 
      $(this).css('-webkit-user-select', 'none'); 
     }); 
     return this; 
    } 
}); 

por su comentario mensaje:I still need to be able to trigger events (notably, touchstart, touchmove, and touchend) on the elements.

yo simplemente habría utilizar un envoltorio que es no afectados por este plugin, sin embargo, es de texto contenidos están protegidos uso de este plugin.

para permitir la interacción con un enlace en un bloque de texto, puede utilizar span tags para todos, pero el enlace y añadir el nombre de clase .notSelected sólo para aquellos span tags, preservando así la selección y la interacción del enlace anclas.

Actualización de estado: Esta actualización jsFiddle confirma que le preocupa que quizás otras funciones no funcionen cuando se desactiva la selección de texto. En este jsFiddle actualizado se muestra jQuery Click Event listener que activará una alerta del navegador cuando se haga clic en el texto en negrita, incluso si ese texto en negrita no es seleccionable por texto.

+0

esto no funciona para mi Android 2.3.3 ,,, acaba de ir a la su jsFiddle y probé. Seleccionado todo el texto. ¿Alguna idea? – Oneezy

+0

Gracias por los comentarios. Después de la página web jsFiddle ha cargado, golpeó el botón EJECUTAR antes de la prueba. Además, aunque técnicamente puede seleccionar todo el texto, hacer una copia de eso y pegarlo en el siguiente documento no pegará la parte bloqueada del texto. Si todavía es un problema, intentaré acceder a un Dispositivo Android con ese número de versión. Pensamientos? – arttronics

+0

+1 Fantástico, gracias @arttronics! ¿Qué variación podría evitar que el menú contextual se muestre en "toque prolongado"? –

27
-webkit-touch-callout:none; 
-webkit-user-select:none; 
-khtml-user-select:none; 
-moz-user-select:none; 
-ms-user-select:none; 
user-select:none; 
-webkit-tap-highlight-color:rgba(0,0,0,0); 

Esto lo deshabilitará para cada navegador que vaya.

+0

No es mala intención, pero ¿leíste la pregunta? Tengo exactamente eso enyesado en todo mi CSS (desde identificaciones/clases individuales hasta el cuerpo y '*'), y explícitamente dije que esconder el resaltado es una mala idea .... –

+2

Sí, leí tu enviar. Ahora, ¿realmente probaste el código? Tiene -webkit-touch-callout agregado y la forma correcta de evitar la superposición de resaltado utilizando -webkit-tap-highlight-color. Lo uso en mis webapps y funciona bien, sin menú de contenido, sin resaltado y sin selección. – CoreyRS

+1

Supongo que no mencioné originalmente, pero he tenido '-webkit-touch-callout: none;' allí todo el tiempo también. Lo único que haría '-webkit-tap-highlight-color' sería hacer que el resaltado sea transparente, __not__ desactivarlo. Al principio no me molesté con el código porque no era algo que no había visto antes, pero para apaciguarlo lo intenté y no funcionó. ¿Qué OS/dispositivos ha probado que funcionó? No funciona en Android 2.3 o 3.0 ... –

1

-webkit-user-select: none; no fue compatible con Android hasta 4.1 (lo siento).

+2

¡¿Así que no hay forma de deshacerse de/prevenirlo ?! :( –

Cuestiones relacionadas