Как обернуть все дочерние элементы в классе? - PullRequest
1 голос
/ 06 апреля 2020

У меня есть функция, которая разбивает все строки в элементе и упаковывает их в <div>. Например, если у меня есть элемент, который выглядит следующим образом:

<div class="test">
  Lorem Khaled Ipsum is a major key to success. I’m up to something. To be successful you’ve
  got to work hard, to make history, simple, you’ve got to make it. I told you all this before, when 
  you have a swimming pool, do not use chlorine, use salt water, the healing, salt water is the healing. 
  The key to more success is to get a massage once a week, very important, major key, cloth talk. 
  Wraith talk. Don’t ever play yourself. 
</div>

Тогда он обернет все строки следующим образом:

<div class="test">
  <div class="line_wrap">Lorem Khaled Ipsum is a major key to success. I’m up to something. To be successful you’ve</div>
  <div class="line_wrap">got to work hard, to make history, simple, you’ve got to make it. I told you all this before, when </div> 
  <div class="line_wrap">you have a swimming pool, do not use chlorine, use salt water, the healing, salt water is the healing. </div> 
  <div class="line_wrap">The key to more success is to get a massage once a week, very important, major key, cloth talk. </div> 
  <div class="line_wrap">Wraith talk. Don’t ever play yourself.</div> 
</div>

Проблема, которую я имею, я ищу способ обернуть эти элементы в другой <div>, например:

<div class="test">
  <div class="wrap">
    <div class="line_wrap">Lorem Khaled Ipsum is a major key to success. I’m up to something. To be successful you’ve</div>
    <div class="line_wrap">got to work hard, to make history, simple, you’ve got to make it. I told you all this before, when </div> 
    <div class="line_wrap">you have a swimming pool, do not use chlorine, use salt water, the healing, salt water is the healing. </div> 
    <div class="line_wrap">The key to more success is to get a massage once a week, very important, major key, cloth talk. </div> 
    <div class="line_wrap">Wraith talk. Don’t ever play yourself.</div> 
  </div>
</div>

До сих пор я пытался сделать wrapall, используя функцию .each, но это делает 4 слоя обертываний, и если у меня есть больше чем один элемент, он возьмет все элементы и поместит их в первый элемент.

Мой вопрос: как мне обернуть всех детей в <div>?

Мой рабочий код :

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.forEach(word => {
        section.innerHTML += `<span>${word}</span>`
      })
      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 - 1) {
          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','div', 'line_wrap');


$.each($('.message-contain'), function(i, message) { 

	var size = 6; //define how many elements you want in each wrapper
	var items = $(message).find('.line_wrap'); //the collection of all your items
	var container; //this will be used to add the items in it.
  
  $.each(items, function(i, item) { 
  
    //this expression checks if we need to create a new container
    if (i % size === 0) {
      container = $('<div class="wrapped"></div>'); //create a new container
      $(message).append(container); //add the new container to the body
    }

    $(item).appendTo(container); //add the item to the container
   });
});
$(".emails .multi-items #content").each(function (i) {
  $('.line_wrap').children().wrapAll("<div class='test'></div>");
});
.wrapped {background:black;color:white}
.line_wrap {border:1px solid #aa0000}
#content {margin:35px}
.test {color:yellow}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="emails">
<ul class="multi-items">
  <div class="message-contain">
      <div id="content">
                    1 -  The first of the month is coming, we have to get money, we have no choice. It cost money to eat and they don’t want you to eat. Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy our breakfast. They key is to have every key, the key to open every door. To succeed you must believe. When you believe, you will succeed. They don’t want us to eat.
Another one. Major key, don’t fall for the trap, stay focused. It’s the ones closest to you that want to see you fail. To be successful you’ve got to work hard, to make history, simple, you’ve got to make it. The key to success is to keep your head above the water, never give up. Stay focused. They don’t want us to eat. The key is to drink coconut, fresh coconut, trust me. Give thanks to the most high. Surround yourself with angels, positive energy, beautiful people, beautiful souls, clean heart, angel. Congratulations, you played yourself.
Major key, don’t fall for the trap, stay focused. It’s the ones closest to you that want to see you fail. They never said winning was easy. Some people can’t handle success, I can. Another one. You smart, you loyal, you a genius. Look at the sunset, life is amazing, life is beautiful, life is what you make it. The key to success is to keep your head above the water, never give up. They don’t want us to eat. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears, and I’m never giving up, I’m just getting started.
      </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. Every chance I get, I water the plants, Lion! Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy our breakfast. The other day the grass was brown, now it’s green because I ain’t give up. Never surrender. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears, and I’m never giving up, I’m just getting started.
      </div>
  </div>
</ul>
</div>

Соответствующая часть:

$(".emails .multi-items #content").each(function (i) {
  $('.line_wrap').children().wrapAll("<div class='test'></div>");
});

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Вы можете попытаться создать все элементы oop с элементами .wrapped, найти все элементы .line_wrap внутри и обернуть их:

$('.wrapped').each(function () {
    $(this).find('.line_wrap').wrapAll("<div class='test'></div>")
});

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.forEach(word => {
        section.innerHTML += `<span>${word}</span>`
      })
      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 - 1) {
          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','div', 'line_wrap');


$.each($('.message-contain'), function(i, message) { 

	var size = 6; //define how many elements you want in each wrapper
	var items = $(message).find('.line_wrap'); //the collection of all your items
	var container; //this will be used to add the items in it.
  
  $.each(items, function(i, item) { 
  
    //this expression checks if we need to create a new container
    if (i % size === 0) {
      container = $('<div class="wrapped"></div>'); //create a new container
      $(message).append(container); //add the new container to the body
    }

    $(item).appendTo(container); //add the item to the container
   });
});

$('.wrapped').each(function () {
	$(this).find('.line_wrap').wrapAll("<div class='test'></div>")
});
.wrapped {background:black;color:white}
.line_wrap {border:1px solid #aa0000}
#content {margin:35px}
.test {color:yellow}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="emails">
<ul class="multi-items">
  <div class="message-contain">
      <div id="content">
                    1 -  The first of the month is coming, we have to get money, we have no choice. It cost money to eat and they don’t want you to eat. Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy our breakfast. They key is to have every key, the key to open every door. To succeed you must believe. When you believe, you will succeed. They don’t want us to eat.
Another one. Major key, don’t fall for the trap, stay focused. It’s the ones closest to you that want to see you fail. To be successful you’ve got to work hard, to make history, simple, you’ve got to make it. The key to success is to keep your head above the water, never give up. Stay focused. They don’t want us to eat. The key is to drink coconut, fresh coconut, trust me. Give thanks to the most high. Surround yourself with angels, positive energy, beautiful people, beautiful souls, clean heart, angel. Congratulations, you played yourself.
Major key, don’t fall for the trap, stay focused. It’s the ones closest to you that want to see you fail. They never said winning was easy. Some people can’t handle success, I can. Another one. You smart, you loyal, you a genius. Look at the sunset, life is amazing, life is beautiful, life is what you make it. The key to success is to keep your head above the water, never give up. They don’t want us to eat. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears, and I’m never giving up, I’m just getting started.
      </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. Every chance I get, I water the plants, Lion! Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy our breakfast. The other day the grass was brown, now it’s green because I ain’t give up. Never surrender. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears, and I’m never giving up, I’m just getting started.
      </div>
  </div>
</ul>
</div>
1 голос
/ 06 апреля 2020

Вы можете решить эту проблему, нацелив только на дивизии .line_wrap внутри текущего .wrapped div, через который мы переходим внутри метода .each(). Это необходимо для того, чтобы мы не обернули все .line_wrap сразу во все .wrapped делений:

$(".emails .multi-items .wrapped").each(function (i) {
    $('.line_wrap', this).wrapAll("<div class='test'></div>");
});

Рабочая демонстрация:

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.forEach(word => {
      section.innerHTML += `<span>${word}</span>`
    })
    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 - 1) {
        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', 'div', 'line_wrap');

$.each($('.message-contain'), function(i, message) {
  var size = 6; //define how many elements you want in each wrapper
  var items = $(message).find('.line_wrap'); //the collection of all your items
  var container; //this will be used to add the items in it.
  $.each(items, function(i, item) {
    //this expression checks if we need to create a new container
    if (i % size === 0) {
      container = $('<div class="wrapped"></div>'); //create a new container
      $(message).append(container); //add the new container to the body
    }

    $(item).appendTo(container); //add the item to the container
  });
});

$(".emails .multi-items .wrapped").each(function (i) {
    $('.line_wrap', this).wrapAll("<div class='test'></div>");
});
.wrapped {
  background: black;
  color: white
}

.line_wrap {
  border: 1px solid #aa0000;
  padding: 4px 8px;
}

#content {
  margin: 35px
}

.test {
  color: yellow
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="emails">
  <ul class="multi-items">
    <div class="message-contain">
      <div id="content">
        1 - The first of the month is coming, we have to get money, we have no choice. It cost money to eat and they don’t want you to eat. Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy
        our breakfast. They key is to have every key, the key to open every door. To succeed you must believe. When you believe, you will succeed. They don’t want us to eat. Another one. Major key, don’t fall for the trap, stay focused. It’s the ones
        closest to you that want to see you fail. To be successful you’ve got to work hard, to make history, simple, you’ve got to make it. The key to success is to keep your head above the water, never give up. Stay focused. They don’t want us to eat.
        The key is to drink coconut, fresh coconut, trust me. Give thanks to the most high. Surround yourself with angels, positive energy, beautiful people, beautiful souls, clean heart, angel. Congratulations, you played yourself. Major key, don’t fall
        for the trap, stay focused. It’s the ones closest to you that want to see you fail. They never said winning was easy. Some people can’t handle success, I can. Another one. You smart, you loyal, you a genius. Look at the sunset, life is amazing,
        life is beautiful, life is what you make it. The key to success is to keep your head above the water, never give up. They don’t want us to eat. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat
        and tears, and I’m never giving up, I’m just getting started.
      </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. Every chance I get, I water the plants, Lion! Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast,
        so we are going to enjoy our breakfast. The other day the grass was brown, now it’s green because I ain’t give up. Never surrender. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears,
        and I’m never giving up, I’m just getting started.
      </div>
    </div>
  </ul>
</div>
0 голосов
/ 06 апреля 2020

Просто удалите функцию children, поскольку вы хотите обернуть саму коллекцию jQuery.

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.forEach(word => {
        section.innerHTML += `<span>${word}</span>`
      })
      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 - 1) {
          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','div', 'line_wrap');


$.each($('.message-contain'), function(i, message) { 

	var size = 6; //define how many elements you want in each wrapper
	var items = $(message).find('.line_wrap'); //the collection of all your items
	var container; //this will be used to add the items in it.
  
  $.each(items, function(i, item) { 
  
    //this expression checks if we need to create a new container
    if (i % size === 0) {
      container = $('<div class="wrapped"></div>'); //create a new container
      $(message).append(container); //add the new container to the body
    }

    $(item).appendTo(container); //add the item to the container
   });
});

$('.wrapped').each(function () {
	$(this).find('.line_wrap').wrapAll("<div class='test'></div>")
});
.wrapped {background:black;color:white}
.line_wrap {border:1px solid #aa0000}
#content {margin:35px}
.test {color:yellow}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="emails">
<ul class="multi-items">
  <div class="message-contain">
      <div id="content">
                    1 -  The first of the month is coming, we have to get money, we have no choice. It cost money to eat and they don’t want you to eat. Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy our breakfast. They key is to have every key, the key to open every door. To succeed you must believe. When you believe, you will succeed. They don’t want us to eat.
Another one. Major key, don’t fall for the trap, stay focused. It’s the ones closest to you that want to see you fail. To be successful you’ve got to work hard, to make history, simple, you’ve got to make it. The key to success is to keep your head above the water, never give up. Stay focused. They don’t want us to eat. The key is to drink coconut, fresh coconut, trust me. Give thanks to the most high. Surround yourself with angels, positive energy, beautiful people, beautiful souls, clean heart, angel. Congratulations, you played yourself.
Major key, don’t fall for the trap, stay focused. It’s the ones closest to you that want to see you fail. They never said winning was easy. Some people can’t handle success, I can. Another one. You smart, you loyal, you a genius. Look at the sunset, life is amazing, life is beautiful, life is what you make it. The key to success is to keep your head above the water, never give up. They don’t want us to eat. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears, and I’m never giving up, I’m just getting started.
      </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. Every chance I get, I water the plants, Lion! Egg whites, turkey sausage, wheat toast, water. Of course they don’t want us to eat our breakfast, so we are going to enjoy our breakfast. The other day the grass was brown, now it’s green because I ain’t give up. Never surrender. Put it this way, it took me twenty five years to get these plants, twenty five years of blood sweat and tears, and I’m never giving up, I’m just getting started.
      </div>
  </div>
</ul>
</div>
...