Actualización: Manejar esto en CSS es maravillosamente simple y de bajo costo, pero no tienes control sobre dónde ocurren las interrupciones cuando lo hacen. Eso está bien si no le importa, o si sus datos tienen ejecuciones alfanuméricas largas sin interrupciones naturales. Teníamos muchas rutas de archivos largas, URL y números de teléfono, todos los cuales tienen lugares en los que es significativamente mejor que otros.
Nuestra solución fue usar primero un reemplazo de expresiones regulares para poner un espacio de ancho cero (& # 8203;) después de cada 15 (digamos) caracteres que no son espacios en blanco o uno de los caracteres especiales donde preferiríamos los saltos. Luego hacemos otro reemplazo para poner un espacio de ancho cero después de esos caracteres especiales.
Los espacios de ancho cero son agradables, porque nunca son visibles en la pantalla; los guiones tímidos eran confusos cuando aparecían, porque los datos tienen guiones significativos. Los espacios de ancho cero tampoco se incluyen cuando copia texto fuera del navegador.
Los caracteres de corte especiales que estamos usando actualmente son punto, barra diagonal, barra diagonal inversa, coma, guión bajo, @, | y guión. No pensaría que necesitaría hacer algo para alentar la ruptura después de los guiones, pero Firefox (3.6 y 4 al menos) no se rompe solo en guiones rodeados de números (como los números de teléfono).
También queríamos controlar el número de caracteres entre descansos artificiales, en función del espacio de diseño disponible. Eso significaba que la expresión regular para coincidir con largas carreras sin interrupción tenía que ser dinámica. Esto se llama mucho, y no queríamos crear las mismas expresiones regulares idénticas una y otra vez por razones de rendimiento, por lo que utilizamos un simple caché de expresiones regulares, clave por la expresión de expresiones regulares y sus banderas.
Aquí está el código; Probablemente, el espacio de nombres de las funciones en un paquete de utilidad:
makeWrappable = function(str, position)
{
if (!str)
return '';
position = position || 15; // default to breaking after 15 chars
// matches every requested number of chars that's not whitespace or one of the special chars defined below
var longRunsRegex = cachedRegex('([^\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^\\s\\.\/\\,_@\\|-])', 'g');
return str
.replace(longRunsRegex, '$1​') // put a zero-width space every requested number of chars that's not whitespace or a special char
.replace(makeWrappable.SPECIAL_CHARS_REGEX, '$1​'); // and one after special chars we want to allow breaking after
};
makeWrappable.SPECIAL_CHARS_REGEX = /([\.\/\\,_@\|-])/g; // period, forward slash, backslash, comma, underscore, @, |, hyphen
cachedRegex = function(reString, reFlags)
{
var key = reString + (reFlags ? ':::' + reFlags : '');
if (!cachedRegex.cache[key])
cachedRegex.cache[key] = new RegExp(reString, reFlags);
return cachedRegex.cache[key];
};
cachedRegex.cache = {};
Prueba así:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
Actualización 2: Parece que los espacios de ancho cero de hecho están incluidos en el texto copiado en al menos algunas circunstancias, simplemente no puede verlos. Obviamente, alentar a las personas a que copien texto con caracteres ocultos es una invitación a que ingresen datos como ese en otros programas o sistemas, incluso en el suyo, donde pueden causar problemas. Por ejemplo, si termina en una base de datos, las búsquedas en su contra pueden fallar, y es probable que las cadenas de búsqueda como esta también fallen. El uso de teclas de flecha para moverse por datos como este requiere (correctamente) una pulsación de tecla adicional para moverse por el personaje que no puede ver, algo extraño para los usuarios si lo notan.
En un sistema cerrado, puede filtrar ese carácter en la entrada para protegerse, pero eso no ayuda a otros programas y sistemas.
En total, esta técnica funciona bien, pero no estoy seguro de cuál sería la mejor opción de personaje que causa la ruptura.
Actualización 3: Tener este personaje terminar en datos ya no es una posibilidad teórica, es un problema observado. Los usuarios envían datos copiados de la pantalla, se guardan en la base de datos, las búsquedas se rompen, las cosas se ordenan de forma extraña, etc.
Hicimos dos cosas:
- Escribió una utilidad para eliminarlos de todas las columnas de todas las tablas en todas las fuentes de datos para esta aplicación.
- Se agregó un filtro para eliminarlo a nuestro procesador de entrada de cadena estándar, por lo que desaparece cuando cualquier código lo ve.
Esto funciona bien, al igual que la técnica en sí, pero es una historia de advertencia.
Actualización 4: Estamos usando esto en un contexto en el que los datos alimentados a esto pueden ser HTML escapado. En las circunstancias correctas, puede insertar espacios de ancho cero en el medio de entidades HTML, con resultados originales.
La solución fue agregar ampersand a la lista de personajes en los que no rompemos, así:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');