Cập nhật: Xử lý việc này trong CSS rất đơn giản và chi phí thấp, nhưng bạn không có quyền kiểm soát nơi xảy ra sự cố khi chúng xảy ra. Điều đó tốt nếu bạn không quan tâm, hoặc dữ liệu của bạn có các chữ số dài chạy mà không có bất kỳ ngắt tự nhiên nào. Chúng tôi có rất nhiều đường dẫn tệp dài, URL và số điện thoại, tất cả đều có những vị trí tốt hơn đáng kể để phá vỡ hơn những nơi khác.
Giải pháp của chúng tôi trước tiên là sử dụng thay thế regex để đặt một không gian có độ rộng bằng không (& # 8203;) sau mỗi 15 ký tự (không nói) không có khoảng trắng hoặc một trong các ký tự đặc biệt mà chúng tôi muốn ngắt. Sau đó, chúng tôi thực hiện một thay thế khác để đặt một không gian có độ rộng bằng 0 sau các ký tự đặc biệt đó.
Không gian có chiều rộng bằng không là tốt, bởi vì chúng không bao giờ hiển thị trên màn hình; hyphens nhút nhát đã gây nhầm lẫn khi họ cho thấy, bởi vì dữ liệu có dấu gạch ngang đáng kể. Không gian có chiều rộng bằng không cũng không được bao gồm khi bạn sao chép văn bản ra khỏi trình duyệt.
Các ký tự ngắt đặc biệt mà chúng tôi hiện đang sử dụng là dấu chấm, dấu gạch chéo, dấu gạch chéo ngược, dấu phẩy, dấu gạch dưới, @, | và dấu gạch nối. Bạn sẽ không nghĩ mình cần làm gì để khuyến khích phá vỡ sau các dấu gạch nối, nhưng Firefox (ít nhất là 3.6 và 4) không tự phá vỡ tại các dấu gạch nối được bao quanh bởi các số (như số điện thoại).
Chúng tôi cũng muốn kiểm soát số lượng ký tự giữa các lần ngắt nhân tạo, dựa trên không gian bố trí có sẵn. Điều đó có nghĩa là regex để phù hợp với các bước chạy không phá vỡ dài cần phải năng động. Điều này được gọi rất nhiều và chúng tôi không muốn tạo ra cùng một biểu thức chính xác giống nhau vì lý do hiệu suất, vì vậy chúng tôi đã sử dụng bộ đệm regex đơn giản, được khóa bởi biểu thức regex và cờ của nó.
Đây là mã; bạn có thể không gian tên các chức năng trong một gói tiện ích:
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 = {};
Kiểm tra như thế này:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
Cập nhật 2: Trên thực tế, có vẻ như các không gian có độ rộng bằng không được bao gồm trong văn bản được sao chép trong ít nhất một số trường hợp, bạn không thể nhìn thấy chúng. Rõ ràng, khuyến khích mọi người sao chép văn bản có các ký tự ẩn trong đó là một lời mời để có dữ liệu như được nhập vào các chương trình hoặc hệ thống khác, thậm chí là của chính bạn, nơi nó có thể gây ra sự cố. Chẳng hạn, nếu nó kết thúc trong cơ sở dữ liệu, các tìm kiếm đối với nó có thể thất bại và các chuỗi tìm kiếm như thế này cũng có khả năng thất bại. Sử dụng các phím mũi tên để di chuyển qua dữ liệu như thế này đòi hỏi (phải) một phím nhấn bổ sung để di chuyển qua ký tự mà bạn không thể nhìn thấy, hơi kỳ quái cho người dùng nếu họ nhận thấy.
Trong một hệ thống khép kín, bạn có thể lọc ký tự đó ra khỏi đầu vào để tự bảo vệ mình, nhưng điều đó không giúp ích gì cho các chương trình và hệ thống khác.
Tất cả đã nói, kỹ thuật này hoạt động tốt, nhưng tôi không chắc sự lựa chọn tốt nhất của nhân vật gây đột phá sẽ là gì.
Cập nhật 3: Việc nhân vật này kết thúc dữ liệu không còn là một khả năng lý thuyết, đó là một vấn đề được quan sát. Người dùng gửi dữ liệu được sao chép khỏi màn hình, nó được lưu trong db, ngắt tìm kiếm, mọi thứ sắp xếp một cách kỳ lạ, v.v.
Chúng tôi đã làm hai điều:
- Đã viết một tiện ích để xóa chúng khỏi tất cả các cột của tất cả các bảng trong tất cả các nguồn dữ liệu cho ứng dụng này.
- Đã thêm tính năng lọc để xóa nó vào bộ xử lý đầu vào chuỗi tiêu chuẩn của chúng tôi, do đó, sẽ đến lúc bất kỳ mã nào nhìn thấy nó.
Điều này hoạt động tốt, cũng như kỹ thuật, nhưng nó là một câu chuyện cảnh báo.
Cập nhật 4: Chúng tôi đang sử dụng điều này trong bối cảnh dữ liệu được cung cấp cho điều này có thể được thoát HTML. Trong trường hợp phù hợp, nó có thể chèn khoảng trắng có độ rộng bằng không vào giữa các thực thể HTML, với kết quả thú vị.
Cách khắc phục là thêm dấu và vào danh sách các ký tự mà chúng ta không ngắt, như thế này:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');