Pembaruan: Menangani ini dalam CSS luar biasa sederhana dan overhead rendah, tetapi Anda tidak memiliki kontrol atas di mana istirahat terjadi ketika mereka melakukannya. Tidak masalah jika Anda tidak peduli, atau data Anda memiliki alfanumerik panjang tanpa jeda yang alami. Kami memiliki banyak jalur file panjang, URL, dan nomor telepon, yang semuanya memiliki tempat yang jauh lebih baik untuk dihancurkan daripada yang lain.
Solusi kami adalah pertama-tama menggunakan pengganti regex untuk menempatkan spasi nol-lebar (& # 8203;) setelah setiap 15 (katakanlah) karakter yang bukan spasi putih atau salah satu karakter khusus tempat kami lebih suka istirahat. Kami kemudian melakukan penggantian lain untuk menempatkan spasi nol-lebar setelah karakter khusus itu.
Ruang lebar nol bagus, karena tidak pernah terlihat di layar; tanda hubung pemalu membingungkan ketika mereka menunjukkan, karena data memiliki tanda hubung yang signifikan. Nol-lebar spasi juga tidak termasuk ketika Anda menyalin teks dari browser.
Karakter break khusus yang kami gunakan saat ini adalah titik, garis miring, garis miring terbalik, koma, garis bawah, @, |, dan tanda hubung. Anda tidak akan berpikir perlu melakukan apa pun untuk mendorong penghancuran setelah tanda hubung, tetapi Firefox (setidaknya 3,6 dan 4) tidak pecah dengan sendirinya di tanda hubung yang dikelilingi oleh angka (seperti nomor telepon).
Kami juga ingin mengontrol jumlah karakter antara jeda buatan, berdasarkan ruang tata letak yang tersedia. Itu berarti bahwa regex untuk mencocokkan berjalan lama tanpa melanggar harus dinamis. Ini dipanggil banyak, dan kami tidak ingin membuat regex identik yang sama berulang kali untuk alasan kinerja, jadi kami menggunakan cache regex sederhana, dikunci oleh ekspresi regex dan benderanya.
Ini kodenya; Anda mungkin akan namespace fungsi dalam paket utilitas:
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 = {};
Tes seperti ini:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
Memperbarui 2: Tampaknya ruang nol-lebar sebenarnya yang termasuk dalam teks disalin dalam setidaknya beberapa keadaan, Anda tidak bisa melihat mereka. Jelas, mendorong orang untuk menyalin teks dengan karakter tersembunyi di dalamnya adalah undangan untuk memiliki data seperti itu yang dimasukkan ke dalam program atau sistem lain, bahkan Anda sendiri, di mana ia dapat menyebabkan masalah. Misalnya, jika berakhir di basis data, pencarian yang menentangnya mungkin gagal, dan string pencarian seperti ini juga cenderung gagal. Menggunakan tombol panah untuk bergerak melalui data seperti ini membutuhkan (benar) penekanan tombol ekstra untuk bergerak melintasi karakter yang tidak dapat Anda lihat, agak aneh bagi pengguna jika mereka perhatikan.
Dalam sistem tertutup, Anda dapat memfilter karakter itu pada input untuk melindungi diri Anda, tetapi itu tidak membantu program dan sistem lain.
Semua mengatakan, teknik ini bekerja dengan baik, tetapi saya tidak yakin apa pilihan terbaik dari karakter yang menyebabkan istirahat.
Pembaruan 3: Memiliki karakter ini berakhir di data bukan lagi kemungkinan teoretis, ini adalah masalah yang diamati. Pengguna mengirimkan data yang disalin dari layar, itu akan disimpan di db, pencarian istirahat, hal-hal semacam aneh, dll.
Kami melakukan dua hal:
- Menulis utilitas untuk menghapusnya dari semua kolom semua tabel di semua sumber data untuk aplikasi ini.
- Menambahkan pemfilteran untuk menghapusnya ke prosesor input string standar kami, sehingga hilang saat kode melihatnya.
Ini bekerja dengan baik, seperti halnya teknik itu sendiri, tetapi ini adalah kisah peringatan.
Pembaruan 4: Kami menggunakan ini dalam konteks di mana data yang diumpankan ke ini mungkin berasal dari HTML. Dalam keadaan yang tepat, ini dapat menyisipkan spasi nol-lebar di tengah-tengah entitas HTML, dengan hasil yang funky.
Perbaiki adalah untuk menambahkan ampersand ke daftar karakter yang tidak kita hancurkan, seperti ini:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');