How to wrap all images with same alt

Viewed 31

this's my code

<div class="portfolio-project">
   <img src="https://picsum.photos/id/31/800/800" alt="p1">
   <img src="https://picsum.photos/id/32/800/800" alt="p2">
   <img src="https://picsum.photos/id/33/800/800" alt="p3">
   <img src="https://picsum.photos/id/34/800/800" alt="p1">
   <img src="https://picsum.photos/id/35/800/800" alt="p2">
   <img src="https://picsum.photos/id/36/800/800" alt="p3">
</div>

i want like this

<div class="portfolio-project">
  <div class="p1">
    <img src="https://picsum.photos/id/31/800/800" alt="p1">
    <img src="https://picsum.photos/id/34/800/800" alt="p1">
  </div>
  <div class="p2">
    <img src="https://picsum.photos/id/32/800/800" alt="p2">
    <img src="https://picsum.photos/id/35/800/800" alt="p2">
  </div>
  <div class="p3">
    <img src="https://picsum.photos/id/33/800/800" alt="p3">
    <img src="https://picsum.photos/id/36/800/800" alt="p3">
  </div>
</div>

I try apply my code as : jQuery add alt tag to images with same src but i encountered a problem, my code have multi-wrap like this.

$(function($) {
  $("img").each(function(i, y) {
    var src = $(y).attr('src');
    var alt = $(y).attr('alt');
    $("img[alt='" + alt + "']").wrapAll('<div class="' + alt + '"></div>');
  });
});
img {
  width:50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="portfolio-project">
      <img src="https://picsum.photos/id/31/800/800" alt="p1">
      <img src="https://picsum.photos/id/32/800/800" alt="p2">
      <img src="https://picsum.photos/id/33/800/800" alt="p3">
      <img src="https://picsum.photos/id/34/800/800" alt="p1">
      <img src="https://picsum.photos/id/35/800/800" alt="p2">
      <img src="https://picsum.photos/id/36/800/800" alt="p3">
    </div>

how to fix it ?

1 Answers

You need to do a check if its already wrapped, something like this $('.' + alt).length == 0

$(function($) {
  $("img").each(function(i, y) {
    var src = $(y).attr('src');
    var alt = $(y).attr('alt');
    if ($('.' + alt).length == 0)
      $("img[alt='" + alt + "']").wrapAll('<div class="' + alt + '"></div>');
  });
});
img {
  width: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="portfolio-project">
  <img src="https://picsum.photos/id/31/800/800" alt="p1">
  <img src="https://picsum.photos/id/32/800/800" alt="p2">
  <img src="https://picsum.photos/id/33/800/800" alt="p3">
  <img src="https://picsum.photos/id/34/800/800" alt="p1">
  <img src="https://picsum.photos/id/35/800/800" alt="p2">
  <img src="https://picsum.photos/id/36/800/800" alt="p3">
</div>

Related