Ванильный JavaScript добавляет тег <br> после определенного количества символов в строке

Нужна помощь с небольшим манипулированием 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);

Благодарим за помощь

Спасибо

Могу я спросить, почему вы хотите сделать это, а не просто использовать фиксированную ширину и позволить браузеру переносить текст между словами?

user5734311 14.12.2020 22:56

Возможно, это поможет вам css-tricks.com/injecting-line-break

Fabio Lopez 14.12.2020 22:58

Я настоятельно рекомендую вам использовать CSS, как было предложено выше, но если вам все еще нужно реализовать его так, как вы просили, замените последнюю строку javascript на это: document.getElementById('customer-comments').innerHTML = newLines(comments);

Parikshith Kedilaya M 14.12.2020 23:03
"12345678901234567890123456789012345678901234567890123456789‌​01234567890".replace‌​(/(.{10})/g, '$1<br/>');
epascarello 14.12.2020 23:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
1 806
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать что-то вроде этого:

<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>

Потрясающий! Это сработало идеально для моего варианта использования.

Alex Virdee 14.12.2020 23:20

Этот скрипт подсчитает буквы и проверит, сколько слов поместится в заданное количество букв. Затем он добавит тег после того, как слово будет завершено, не вырезая его.

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>

сильный текст

Другие вопросы по теме