Нужна помощь с небольшим манипулированием JavaScript DOM, чтобы разделить строку на новые строки.
У меня есть один обертывающий div вокруг строки...
<div id= "customer-comments">
// Div contains text of comments & no other wrapping HTML tags
Customer comment 1 - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in ligula neque. Aenean urna nisi, rutrum ac neque eu, aliquet aliquam ligula. Customer comment 2 - Etiam venenatis lacus quam, et imperdiet risus tempor quis. Aenean elit justo, fermentum ac leo vel, bibendum mattis est. Vestibulum sed condimentum mi, id ullamcorper libero
</div>
Я пытаюсь использовать vanilla js для добавления тега <br>
после определенной суммы (120 символов) в строку. Я использую внешний интерфейс (глубокий) для загрузки экрана, и есть функция добавления событий JavaScript при загрузке на определенные экраны, поэтому я пробую некоторые из ванильных js ниже.
// Add new lines for customer comments display panel
let comments = document.getElementById('customer-comments').innerText; // grab comment string in div
function newLines(str) {
if (str.length >= 120) {
let result = '';
while (str.length > 0) {
result += str.substring(0, 120) + '<br>';
str = str.substring(120);
}
return result;
}
return str;
}
newLines(comments);
Благодарим за помощь
Спасибо
Возможно, это поможет вам css-tricks.com/injecting-line-break
Я настоятельно рекомендую вам использовать CSS, как было предложено выше, но если вам все еще нужно реализовать его так, как вы просили, замените последнюю строку javascript на это: document.getElementById('customer-comments').innerHTML = newLines(comments);
"1234567890123456789012345678901234567890123456789012345678901234567890".replace(/(.{10})/g, '$1<br/>');
Вы можете использовать что-то вроде этого:
<div id= "customer-comments">
Customer comment 1 - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in ligula neque. Aenean urna nisi, rutrum ac neque eu, aliquet aliquam ligula. Customer comment 2 - Etiam venenatis lacus quam, et imperdiet risus tempor quis. Aenean elit justo, fermentum ac leo vel, bibendum mattis est. Vestibulum sed condimentum mi, id ullamcorper libero
</div>
<br>
<p>Split Up:</p>
<br>
<div id = "div2"></div>
<script>
function chunk(str, n) {
var ret = [];
for(var i = 0; i < str.length; i += n) ret.push(str.substr(i, n))
return ret;
};
let commentsText = document.getElementById('customer-comments').innerText;
document.getElementById("div2").innerHTML = chunk(commentsText, 120).join('<br>');
</script>
Вы можете сделать это с помощью простого регулярного выражения вместо циклов и манипуляций со строками.
var out = document.querySelector("#foo");
var text = out.textContent;
var str = text.replace(/(.{10})/g, '$1<br/>');
out.innerHTML = str;
<div id = "foo">1234567890123456789012345678901234567890123456789012345678901234567890</div>
Потрясающий! Это сработало идеально для моего варианта использования.
Этот скрипт подсчитает буквы и проверит, сколько слов поместится в заданное количество букв. Затем он добавит тег после того, как слово будет завершено, не вырезая его.
var max = 120; // Number of letters
var str = '<br>'; // Add <br> tag or something else
var wrapEl = document.getElementById('customer-comments');
var w = wrapEl.innerText.split(' ');
var sum = 0;
var comp = 0;
var l = 0;
for (let i = 0; i < w.length; i++) {
sum = w[i].length + sum;
if (sum >= max) { w.splice(l, 0, str); sum = 0; comp = 0; } else { comp = sum; l = i + 1; }
}
wrapEl.innerHTML = w.join(' ');
<div id = "customer-comments">
Customer comment 1 - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in ligula neque. Aenean urna
nisi, rutrum ac neque eu, aliquet aliquam ligula. Customer comment 2 - Etiam venenatis lacus quam, et imperdiet
risus tempor quis. Aenean elit justo, fermentum ac leo vel, bibendum mattis est. Vestibulum sed condimentum mi,
id ullamcorper libero
</div>
И с помощью простого цикла, добавляя символ на каждой итерации, а на ключевой символ добавляйте br
var str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we use it? It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like)."
var x = 0;
var newStr = ""
for(var i = 0; i < str.length; i++){
if (x == 120){
newStr + = "<br>"
x=0
}
newStr += str[i]
x++;
}
console.info(newStr)
Вы можете создать функцию, которая принимает параметры для строки, количество, которое вы хотите перебрать, а также тип элемента, на который нужно разбить строку вместе с атрибутом класса.
Внутри функции цикл for, который разбивает и помещает значения внутри цикла в массив. После того, как массив создан, выполните цикл по массиву и присвойте каждому значению теги span, которые стилизованы для отображения в виде элементов уровня блока.
Вы не только получаете контроль над количеством циклов на строку, но также и тип элемента, который вы хотите создать, и добавляете атрибут класса к элементу для стилизации.
// get the str using textContent
var str = document.getElementById('str');
// function that runs a for loop and checks if the character
// counted in that string exceeds a given number (num), if so
// push the result of the loop between the remainder and num // into an array value repeat this process.
// Loop over the resulting array and create span tags for each
// value within the arr. Assign a class that displays as a
// block level element, affectively creating a new line.
function formatStr(str, num, el, attr) {
var result = [];
for (var i = 0; i < str.length; i += num) {
result.push(str.substr(i, num));
}
var output = '';
for (let j in result) {
output += `<${el}${attr}>${result[j]}</${el}>`;
}
return output;
}
// reset the original displayed div to the newly formatted
// span elements with 10 characters per line
// and add a class block-level with a block display
document.getElementById("str").innerHTML = formatStr(str.textContent, 10, 'span', ' class = "block-level"');
// display the original string reformtted to div elements
// with 20 characters per line and add a class of
// yellow-bg
document.getElementById("results").innerHTML = formatStr(str.textContent, 20, 'div', ' class = "yellow-bg"');
// display the original string with 5 perline to p tags
// with no added class
document.getElementById("results2").innerHTML = formatStr(str.textContent, 5, 'p', '');
.block-level {
display: block;
}
.yellow-bg {
background-color: yellow;
padding: 5px;
margin-bottom: 3px;
}
<div id = "str">1234567890123456789012345678901234567890123456789012345678901234567890</div>
<div id = "results"></div>
<div id = "results2"></div>
сильный текст
Могу я спросить, почему вы хотите сделать это, а не просто использовать фиксированную ширину и позволить браузеру переносить текст между словами?