This commit is contained in:
2025-07-17 11:42:38 +08:00
parent 97b851e8a6
commit b1fb932aae
3 changed files with 90 additions and 23 deletions

View File

@@ -173,28 +173,68 @@
}, 300);
});
// 英文单词截断
// 1. 基础CSS保证必须
$('.ql-editor').css({
'word-break': 'normal',
'overflow-wrap': 'anywhere',
'overflow-x': 'hidden'
});
// 2. 智能处理文本节点
$('.ql-editor').contents().each(function() {
if (this.nodeType === 3) { // 只处理文本节点
const $wrapper = $('<span>').addClass('word-wrapper');
$(this).replaceWith($wrapper.text(this.nodeValue));
}
});
// 3. 处理长单词10个字符以上
$('.word-wrapper').html(function(_, html) {
return html.replace(/([a-zA-Z]{10,})/g, function(match) {
return match.replace(/([a-z])([A-Z])/g, '$1<wbr>$2')
.replace(/(.{5})/g, '$1<wbr>');
// 1. 基础处理函数
function processTextNodes($element) {
$element.contents().each(function() {
if (this.nodeType === 3) { // 文本节点
const text = this.nodeValue.trim();
if (text) {
$(this).replaceWith(
$('<span>').addClass('word-wrapper').text(text)
);
}
} else if (this.nodeType === 1 && !$(this).is('br, img, a')) { // 元素节点(非换行/图片/链接)
processTextNodes($(this));
}
});
}
// 2. 智能断词处理
function smartWordBreak(html) {
return html
// 处理超长单词(15字符以上)
.replace(/([a-zA-Z]{15,})/g, function(match) {
return match
.replace(/([a-z])([A-Z])/g, '$1<wbr>$2') // 驼峰分词
.replace(/([_-])/g, '$1<wbr>') // 连接符分词
.replace(/(.{8})/g, '$1<wbr>'); // 每8字符分词
})
// 保护常见复合词
.replace(/(launch parameters|featured apps)/gi, function(match) {
return match.replace(/\s/g, '<wbr> ');
});
}
// 3. 执行处理
const $editor = $('.ql-editor');
// 先处理文本节点
processTextNodes($editor);
// 再处理所有.word-wrapper
$('.word-wrapper').each(function() {
const $this = $(this);
$this.html(smartWordBreak($this.text()));
});
// 4. 监听动态内容变化(适用于富文本编辑器)
if (typeof MutationObserver !== 'undefined') {
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
$(mutation.addedNodes).each(function() {
processTextNodes($(this));
$('.word-wrapper', this).each(function() {
$(this).html(smartWordBreak($(this).text()));
});
});
});
});
observer.observe($editor[0], {
childList: true,
subtree: true
});
}
});
</script>
{/block}