Update: Die Handhabung in CSS ist wunderbar einfach und mit geringem Aufwand verbunden, aber Sie haben keine Kontrolle darüber, wo Pausen auftreten, wenn sie auftreten. Das ist in Ordnung, wenn Sie sich nicht darum kümmern oder Ihre Daten lange alphanumerische Läufe ohne natürliche Unterbrechungen haben. Wir hatten viele lange Dateipfade, URLs und Telefonnummern, die alle Orte haben, an denen man deutlich besser brechen kann als an anderen.
Unsere Lösung bestand darin, zuerst einen Regex-Ersatz zu verwenden, um nach jeweils 15 (sagen wir) Zeichen, die keine Leerzeichen sind, oder einem der Sonderzeichen, bei denen wir Unterbrechungen bevorzugen, ein Leerzeichen mit der Breite Null (& # 8203;) einzufügen. Wir ersetzen dann erneut, um nach diesen Sonderzeichen ein Leerzeichen mit der Breite Null einzufügen.
Leerzeichen mit einer Breite von Null sind schön, weil sie auf dem Bildschirm nie sichtbar sind. schüchterne Bindestriche waren verwirrend, als sie angezeigt wurden, da die Daten signifikante Bindestriche enthalten. Leerzeichen mit der Breite Null sind ebenfalls nicht enthalten, wenn Sie Text aus dem Browser kopieren.
Die Sonderzeichen, die wir derzeit verwenden, sind Punkt, Schrägstrich, Backslash, Komma, Unterstrich, @, | und Bindestrich. Sie würden nicht glauben, dass Sie etwas tun müssten, um das Brechen nach Bindestrichen zu fördern, aber Firefox (mindestens 3.6 und 4) bricht bei Bindestrichen, die von Zahlen (wie Telefonnummern) umgeben sind, nicht von selbst.
Wir wollten auch die Anzahl der Zeichen zwischen künstlichen Pausen basierend auf dem verfügbaren Layoutbereich steuern. Das bedeutete, dass der Regex für lange, nicht brechende Läufe dynamisch sein musste. Dies wird häufig aufgerufen, und wir wollten aus Leistungsgründen nicht immer wieder dieselben identischen regulären Ausdrücke erstellen. Daher haben wir einen einfachen regulären Ausdrucks-Cache verwendet, der durch den regulären Ausdruck und seine Flags gekennzeichnet ist.
Hier ist der Code; Sie würden wahrscheinlich die Funktionen in einem Dienstprogrammpaket mit einem Namespace versehen:
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 = {};
Test wie folgt:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
Update 2: Es scheint, dass Leerzeichen mit einer Breite von null tatsächlich in kopiertem Text enthalten sind, zumindest unter bestimmten Umständen. Sie können sie einfach nicht sehen. Das Ermutigen von Personen, Text mit versteckten Zeichen zu kopieren, ist natürlich eine Einladung, solche Daten in andere Programme oder Systeme, auch in Ihre eigenen, einzugeben, wo dies zu Problemen führen kann. Wenn es beispielsweise in einer Datenbank landet, schlagen die Suchvorgänge möglicherweise fehl, und Suchzeichenfolgen wie diese schlagen wahrscheinlich ebenfalls fehl. Die Verwendung von Pfeiltasten zum Bewegen solcher Daten erfordert (zu Recht) einen zusätzlichen Tastendruck, um sich über das nicht sichtbare Zeichen zu bewegen. Dies ist für Benutzer etwas bizarr, wenn sie es bemerken.
In einem geschlossenen System können Sie dieses Zeichen bei der Eingabe herausfiltern, um sich zu schützen, aber das hilft anderen Programmen und Systemen nicht.
Alles in allem funktioniert diese Technik gut, aber ich bin mir nicht sicher, welche die beste Wahl für einen Bruch verursachenden Charakter wäre.
Update 3: Dass dieses Zeichen in Daten landet, ist keine theoretische Möglichkeit mehr, sondern ein beobachtetes Problem. Benutzer senden Daten, die vom Bildschirm kopiert wurden, sie werden in der Datenbank gespeichert, Suchanfragen werden unterbrochen, die Dinge werden seltsam sortiert usw.
Wir haben zwei Dinge getan:
- Schrieb ein Dienstprogramm, um sie aus allen Spalten aller Tabellen in allen Datenquellen für diese App zu entfernen.
- Filterung hinzugefügt, um es zu unserem Standard-String-Eingabeprozessor zu entfernen, sodass es zu dem Zeitpunkt weg ist, an dem Code es sieht.
Dies funktioniert gut, ebenso wie die Technik selbst, aber es ist eine warnende Geschichte.
Update 4: Wir verwenden dies in einem Kontext, in dem die hier eingegebenen Daten möglicherweise HTML-maskiert sind. Unter den richtigen Umständen können Leerzeichen mit der Breite Null in die Mitte von HTML-Entitäten eingefügt werden, was zu unkonventionellen Ergebnissen führt.
Die Korrektur bestand darin, der Liste der Zeichen, auf die wir nicht verzichten, kaufmännisches Und hinzuzufügen:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');