skip to Main Content

I have a script in my code to remove all empty heading tags so they’re not read by screen readers:

    $("h1:empty, h2:empty, h3:empty, h4:empty, h5:empty, h6:empty").replaceWith('');

but it’s not picking up heading tags that contain additional empty html like <h2><strong></strong></h2>

How can I also remove these?

5

Answers


  1. You can use :only-child pseudo class to select elements which are the only child of a parent element, remove the node, then check if the parent node has .children, if not remove the parent node

    let nodes = document.querySelector("div")
                .querySelectorAll(":only-child");
    
    nodes.forEach(node => {
      if (!node.childNodes.length) {
        let parent = node.parentNode;
        node.parentNode.removeChild(node);
        if (!parent.children.length) {
          parent.parentNode.removeChild(parent)
        }
      }
    });
    
    console.log(document.querySelector("div").innerHTML);
     
    

    I tested it on the following code

    <div>
        <div>
            <p></p>
        </div>
        <div>
            <p>Some content</p>
        </div>
    </div>
    
    Login or Signup to reply.
  2. You need to use text() property.

    $('h1, h2, h3, h4, h5, h6').each(function(){
        if( $(this).text().trim() === '' )
            $(this).remove();
    });
    
    Login or Signup to reply.
  3. Here is how to do this with vanilla JavaScript:

    document.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach(el =>
      !el.textContent.replace(/(s|n)+/g, '') && el.remove());
    <h1>abc</h1>
    <h2>def</h2>
    <h3>
      <strong>
      
      </strong>
    </h3>
    Login or Signup to reply.
  4. Try this in JavaScript

    const tags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
    const nodes = document.querySelectorAll(tags.join(','));
    nodes.forEach(elm => {
       if (elm.innerText.trim() === "") {
          elm.remove();
       }
    });
    console.log(document.querySelector("#result").innerHTML);
    <div id="result">
    <h1>Hello</h1>
    <h2><strong>   </strong></h2>
    <h3>Element</h3>
    <h4> </h4>
    <h2>
      <p>
        <strong>   </strong>
      </p>
      <span> </span>
    </h2>
    </div>
    Login or Signup to reply.
  5. This script would be helpful:

    function onlyHaveEmpty(el){
      el = $(el);
      result = true;
      if(el.is(':empty')){
        return true;
      }else{
        if(el.children().length==0){
          return false;
        }else{
          el.children().each(function(idx, child){
            if(!onlyHaveEmpty(child)){
              result = false;
              return;
            }
          });
          return result;
        }
      }
    }
    
    $(":header").each(function(idx, el){
      if(onlyHaveEmpty(el)){
        el.remove();
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <p>Hello!</p>
    <h1></h1>
    <h3>It's me.</h3>
    <p>World!</p>
    <h2><strong></strong></h2>
    <h2><strong>Hi!</strong></h2>
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search