HTML DOM-узлы включают свое содержимое, поэтому вы не можете разделить их, не сломав их. Следующий код преобразует вашу строку в дерево DOM. Разделите все дочерние узлы и повторно объедините их без разрыва слов или HTML в зависимости от длины их текстового содержимого.
Если ваши данные плохие и, например, в них есть один абзац, который занимает больше чем одна страница или длинная серия букв без пробелов, тогда вам, вероятно, придется придумать индивидуальные решения для каждого типа тега HTML и длинных серий символов.
Даже с В этом решении вы можете обнаружить, что для сохранения предварительных тегов в целевых объектах вашей страницы необходимы дополнительные усилия.
Эта функция принимает два аргумента: вашу строку и максимальную длину, которую вы хотите для textContent в символах.
var shard = function(str, len) {
var el = document.createElement('div');
el.innerHTML = str;
var child = el.firstChild;
var parts = [];
while(child) {
if (child.nodeType == 3) {
var texts = child.nodeValue.split('')
.reduce(function(a,b){
if (b.split(/\s/).length > 1) {
a[a[a.length-1].length > 0 ? a.length: a.length - 1] = b;
a[a.length] = ''
} else {
a[a.length - 1] = a[a.length - 1] + b;
} return a; },['']);
for(var idx=0; idx<texts.length; idx++) {
parts.push(document.createTextNode(texts[idx]));
}
} else {
parts.push(child);
}
child = child.nextSibling;
}
var textParts = parts.map(function(el) { return el.textContent; });
var partsOut = [''];
var t = 0;
for(var idx=0; idx<parts.length; idx++) {
if ((t + textParts[idx].length) > len) {
partsOut[partsOut.length] = parts[idx].nodeType == 3 ?
parts[idx].nodeValue : parts[idx].outerHTML;
t = textParts[idx].length;
} else {
partsOut[partsOut.length - 1] = partsOut[partsOut.length - 1] + (
parts[idx].nodeType == 3 ?
parts[idx].nodeValue :
parts[idx].outerHTML
);
t += textParts[idx].length;
}
}
return partsOut;
};
Вероятно, это не то, что вы хотите использовать в производственной среде, но он делает попытку, где это возможно, разбить HTML на непрерывные части с целевой длиной текстового содержимого.