Aggiornamento: gestire questo nei CSS è meravigliosamente semplice e con un basso sovraccarico, ma non hai alcun controllo su dove si verificano le interruzioni quando lo fanno. Va bene se non ti interessa, o i tuoi dati hanno lunghe corse alfanumeriche senza interruzioni naturali. Avevamo un sacco di lunghi percorsi di file, URL e numeri di telefono, ognuno dei quali ha dei posti in cui è decisamente meglio interrompere rispetto ad altri.
La nostra soluzione era di usare prima una sostituzione regex per inserire uno spazio di larghezza zero (& # 8203;) dopo ogni 15 (diciamo) caratteri che non sono spazi bianchi o uno dei caratteri speciali in cui preferiremmo le pause. Facciamo quindi un altro rimpiazzo per inserire uno spazio di larghezza zero dopo quei caratteri speciali.
Gli spazi a larghezza zero sono belli, perché non sono mai visibili sullo schermo; trattini timidi erano confusi quando hanno mostrato, perché i dati hanno trattini significativi. Inoltre, gli spazi di larghezza zero non sono inclusi quando si copia il testo dal browser.
I caratteri di interruzione speciali che stiamo attualmente utilizzando sono punto, barra, barra rovesciata, virgola, trattino basso, @, | e trattino. Non penseresti di dover fare nulla per incoraggiare la rottura dopo trattini, ma Firefox (almeno 3.6 e 4) non si rompe da solo nei trattini racchiusi tra numeri (come i numeri di telefono).
Volevamo anche controllare il numero di caratteri tra interruzioni artificiali, in base allo spazio di layout disponibile. Ciò significava che la regex per abbinare lunghe corse senza interruzioni doveva essere dinamica. Questo viene chiamato molto, e non volevamo creare le stesse identiche regex più e più volte per motivi di prestazioni, quindi abbiamo usato una semplice cache regex, codificata dall'espressione regex e dai suoi flag.
Ecco il codice; avresti probabilmente lo spazio dei nomi delle funzioni in un pacchetto di utilità:
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 = {};
Prova in questo modo:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
Aggiornamento 2: sembra che gli spazi a larghezza zero siano effettivamente inclusi nel testo copiato in almeno alcune circostanze, semplicemente non riesci a vederli. Ovviamente, incoraggiare le persone a copiare del testo con caratteri nascosti è un invito ad avere dati come quelli inseriti in altri programmi o sistemi, anche i tuoi, dove potrebbero causare problemi. Ad esempio, se finisce in un database, le ricerche su di esso potrebbero non riuscire e anche le stringhe di ricerca come questa potrebbero fallire. Usare i tasti freccia per spostarsi tra i dati in questo modo richiede (giustamente) un tasto aggiuntivo per spostarsi sul personaggio che non si vede, un po 'bizzarro per gli utenti se lo notano.
In un sistema chiuso, puoi filtrare quel carattere sull'input per proteggerti, ma ciò non aiuta altri programmi e sistemi.
Tutto sommato, questa tecnica funziona bene, ma non sono sicuro di quale sarebbe la scelta migliore per il personaggio che causa la rottura.
Aggiornamento 3: Avere questo personaggio nei dati non è più una possibilità teorica, è un problema osservato. Gli utenti inviano i dati copiati dallo schermo, vengono salvati nel database, le ricerche si interrompono, le cose si ordinano in modo strano ecc.
Abbiamo fatto due cose:
- Ha scritto un'utilità per rimuoverli da tutte le colonne di tutte le tabelle in tutte le origini dati per questa app.
- Aggiunto filtro per rimuoverlo al nostro processore di input di stringhe standard, quindi non è più disponibile quando viene visualizzato da qualsiasi codice.
Funziona bene, così come la tecnica stessa, ma è una storia di ammonimento.
Aggiornamento 4: lo stiamo utilizzando in un contesto in cui i dati forniti possono essere sottoposti a escape HTML. Nelle giuste circostanze, può inserire spazi di larghezza zero nel mezzo di entità HTML, con risultati funky.
La correzione consisteva nell'aggiungere la e commerciale all'elenco di caratteri su cui non ci rompiamo, in questo modo:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');