Search code examples
javascriptfunctiondom-manipulationcode-duplication

How to avoid code duplication in this Javascript code snippet


I have tried to add, remove and toggle classstyles to 3 <li> s when user click on 3 buttons having ids 'add' 'delete' and 'toggle' respectively. But the codes repeat itself other than the classList method name and button id.

is there anyway i could write a function to avoid repetition?

here is my code.

document.querySelector('#add').addEventListener('click',()=>{
    document.querySelectorAll('#todos li').forEach((li)=>{
        li.classList.add('listStyles');
    })
});
document.querySelector('#delete').addEventListener('click',()=>{
    document.querySelectorAll('#todos li').forEach((li)=>{
        li.classList.remove('listStyles');
    })
});
document.querySelector('#toggle').addEventListener('click',()=>{
    document.querySelectorAll('#todos li').forEach((li)=>{
        li.classList.toggle('listStyles');
    })
});

Solution

  • You could do it like this:

    function modifyClass(action) {
        document.querySelectorAll('#todos li').forEach((li)=>{
            li.classList[action]('listStyles');
        })
    }
    
    document.querySelector('#add').addEventListener('click', ()=>{ modifyClass("add") });
    document.querySelector('#delete').addEventListener('click', ()=>{ modifyClass("remove") });
    document.querySelector('#toggle').addEventListener('click', ()=>{ modifyClass("toggle") });
    

    If you changed the element #delete to #remove, you could do:

    for (const action of ["add", "remove", "toggle"])
        document.getElementById(action).addEventListener("click", ()=>{
            document.querySelectorAll('#todos li').forEach((li)=>{
                li.classList[action]('listStyles');
            });
        });