javascript - 如何在每个部分的跨度中分割和换行?

标签 javascript jquery split

我使用“Detect browser wrapped lines via javascript ”作为将每一行包装在 <span> 中的方式。但是,如果有多个元素需要拆分和换行,我就会遇到问题。

例如:如果我有多个部分需要拆分和换行,例如:

<div class="emails">
<ul class="multi-items">
  <div class="message-contain">
   <div id="content">
       1 - Lorem Khaled Ipsum is a major key to success. They will try to close the door on you, just open it. Watch your back, but more importantly when you get out the shower, dry your back, it’s a cold world out there. 
   </div>
</div>
<div class="message-contain">
  <div id="content">
       2 - The key to more success is to get a massage once a week, very important, major key, cloth talk. Eliptical talk. 
  </div>
</div>
</ul>
</div>

它将获取 .content 中的所有文本,将它们拆分并包裹在 <span> 中并复制它们。所以看跌期权看起来像这样;

<div class="emails">
<ul class="multi-items">
  <div class="message-contain">
   <div id="content">
       <span class="line_wrap">1 - Lorem Khaled Ipsum is a major key to success.</span>
       <span class="line_wrap">They will try to close the door on you, just open it.</span>
       <span class="line_wrap">Watch your back, but more importantly when you get out the</span>
       <span class="line_wrap">shower, dry your back, it’s a cold world out there.</span> 
       <span class="line_wrap">2 - The key to more success is to get a massage once</span>
       <span class="line_wrap">a week, very important, major key, cloth talk.</span>
       <span class="line_wrap">Eliptical talk.</span> 
   </div>
</div>
<div class="message-contain">
  <div id="content">
       <span class="line_wrap">1 - Lorem Khaled Ipsum is a major key to success.</span>
       <span class="line_wrap">They will try to close the door on you, just open it.</span>
       <span class="line_wrap">Watch your back, but more importantly when you get out the</span>
       <span class="line_wrap">shower, dry your back, it’s a cold world out there.</span> 
       <span class="line_wrap">2 - The key to more success is to get a massage once</span>
       <span class="line_wrap">a week, very important, major key, cloth talk.</span>
       <span class="line_wrap">Eliptical talk.</span>
  </div>
</div>
</ul>
</div>

我添加了 1 - 和 2 - 以表明它们是重复的。应该是在不同的部分,而不是在所有部分。

无论如何,如何分割并换行 <span> 中的每一行在每个部分中而不创建重复的内容?

工作示例:https://codepen.io/openbayou/pen/poJwaXv

JS 代码:

$(".emails .multi-items").each(function (i) {
var $cont = $('.emails .multi-items .message-contain #content')
var text_arr = $cont.text().split(' ');
for (i = 0; i < text_arr.length; i++) {
  text_arr[i] = '<span>' + text_arr[i] + ' </span>';
}

$cont.html(text_arr.join(''));
$wordSpans = $cont.find('span');

var lineArray = [],
  lineIndex = 0,
  lineStart = true,
  lineEnd = false

  $wordSpans.each(function(idx) {
      var pos = $(this).position();
      var top = pos.top;

      if (lineStart) {
          lineArray[lineIndex] = [idx];
          lineStart = false;

      } else {
          var $next = $(this).next();

          if ($next.length) {
              if ($next.position().top > top) {
                  lineArray[lineIndex].push(idx);
                  lineIndex++;
                  lineStart = true
              }
          } else {
              lineArray[lineIndex].push(idx);
          }
      }

  });


 //console.log( lineArray)
 for (i = 0; i < lineArray.length; i++) {
  var start = lineArray[i][0],
      end = lineArray[i][1] + 1;

  /* no end value pushed to array if only one word last line*/
  if (!end) {
      $wordSpans.eq(start).wrap('<span class="line_wrap">')
  } else {
      $wordSpans.slice(start, end).wrapAll('<span class="line_wrap">');
  }

 };
});

最佳答案

我写了一个普通的 JavaScript 版本:

function wrapNewLines(targetSelector, wrapEl = 'span', wrapClass = 'new-line') {
  const content = document.querySelectorAll(targetSelector)
  content.forEach(section => {
    let sectionWidth = section.getBoundingClientRect().width
    let words = section.innerText.split(/( )/g)
    section.innerHTML = words.map(word =>`<span>${word}</span>`).join('')
    let lines = []
    let line = []
    let lineWidth = 0
    let spans = section.querySelectorAll('span')
    spans.forEach((span, i) => {
      let spanWidth = span.getBoundingClientRect().width
      if (lineWidth + spanWidth <= sectionWidth - 4) {
        line.push(span)
        lineWidth += spanWidth
      } else {
        lines.push(line)
        line = []
        lineWidth = 0
        line.push(span)
        lineWidth += spanWidth
      }
    })
    if (line.length) lines.push(line)
    let newLines = lines
      .map(
        line =>
          `<${wrapEl} class=${wrapClass}>${line
            .map(span => span.innerText)
            .join('')}</${wrapEl}>`
      )
      .join('')
    section.innerHTML = newLines
  })
}

wrapNewLines ('.emails .multi-items .message-contain #content');

Here is the gist

关于javascript - 如何在每个部分的跨度中分割和换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60963965/

相关文章:

javascript - 客户端代码 javascript 和 unbounce 的安全问题

javascript - 我是否需要运行我的 AngularJS 应用程序代码,或者如果我使用 ng-app,它会被 AngularJS 调用吗?

JavaScript 清理内存

jquery - Bootstrap4 如何调整网格元素的 Bootstrap 类,但前提是网格发生故障?

c - 在 C 中将字符串拆分为字符串数组

python - 在 python 2.7 中删除之前和包括 _ 的字符

javascript - 如何使用 Google map 中的纬度和经度搜索附近的位置

javascript - iframe 视频显示不正确

jQuery 和 document.write

python - 如何在Python中分割记录?