Home > database >  Include image alt text with jQuery text()
Include image alt text with jQuery text()

Time:09-13

With this HTML:

<h1>This is my <img src="https://dummyimage.com/100x50/000/fff&text=BIG" alt="BIG"> title</h1>

In Chrome or Firefox, if I select the rendered text and copy it (Ctrl-C), I'll get

This is my BIG title (the alt text of the image is included in the copied text)

Can I achieve the same using jQuery? $('h1').text() gives me only This is my title (without BIG).

I know I can get the alt text itself with $('h1').attr('alt') but how do I insert it at the correct position in the .text() string?

CodePudding user response:

Basically I pass on all the nodes (not elements) of the designated element. If type=3 then it's text. Otherwise I assume it's an image and take the alt attribute. It's also possible to make a recursion if the element is div for example. Update: made it recursive.

var h1 = document.querySelector("h1");
var h2 = document.querySelector("h2");

console.log(do_elem(h1));
console.log(do_elem(h2));

function do_elem(elem) {
  var nodes = textNodesUnder(elem);
  return nodes.join("");
}

function textNodesUnder(node) {
  var all = [];
  for (node = node.firstChild; node; node = node.nextSibling) {
    if (node.nodeType == 3) {
      all.push(node.nodeValue);
    } else {
      if (node.tagName == 'IMG') {
        all = all.concat(node.getAttribute("alt"));
      } else {
        all = all.concat(do_elem(node))
      }
    }
  }
  return all;
}
<h1>This is my <img src="https://dummyimage.com/100x50/000/fff&text=BIG" alt="BIG"> title</h1>

<h2>This is <span> another <img src="https://dummyimage.com/100x50/000/fff&text=BIG" alt="BIG"> example</span> of recursion</h2>

CodePudding user response:

The quick and dirty way to do it would be to get every image and insert text before or after it, then reverse after your .text() call

$("img").each(function() {
  if (this.getAttribute("alt")) {
    this.parentNode.insertBefore(document.createTextNode(this.getAttribute("alt"), this);
  }
});

You could try to save the created text nodes in a JQuery or other Object so that after your text call you could remove them all. Alternatively, you could iterate through your imgs again and do

parent.removeChild(img.previousNode);

CodePudding user response:

You could try something like this using jQuery methods.

/*Using jQuery clone() to avoid manipualting the DOM*/
const h1 = $('h1').clone();

//Define the alt text value
const imgAlt = h1.find('img').attr('alt');

//Define the img node inside of the h1 element
const h1Img = h1.find('img');

//Use jQuery replace with method to replace the img node with the previously defined alt text
h1Img.replaceWith(imgAlt);

//Define the text inside the string
const text = h1.text();
console.log(text)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>This is my <img src="https://dummyimage.com/100x50/000/fff&text=BIG" alt="BIG"> title</h1>

  • Related