addEventListener() not working more than once with a button in JavaScript?

The addEventListener() method works multiple times by design. If it seems to work only once, the issue is usually in your event handler function or how you're setting up the listener.

Common Problem: Removing the Element

A frequent mistake is removing or replacing the button element inside the event handler, which destroys the event listener:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>addEventListener Problem</title>
</head>
<body>
    <button id="badButton">Bad Example - Works Once</button>
    <div id="output"></div>

    <script>
        // BAD: This removes the button, breaking the event listener
        document.getElementById('badButton').addEventListener('click', function() {
            this.remove(); // Destroys the button and its event listener
            document.getElementById('output').innerHTML += '<p>Button clicked once</p>';
        });
    </script>
</body>
</html>

Correct Implementation

Here's how addEventListener() should work for multiple clicks:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>addEventListener Multiple Clicks</title>
</head>
<body>
    <button id="clickButton">Click Me Multiple Times</button>
    <div id="result"></div>

    <script>
        let clickCount = 0;
        
        function handleClick(event) {
            clickCount++;
            const newDiv = document.createElement('div');
            newDiv.textContent = `Click ${clickCount}: ${event.type} event fired`;
            document.getElementById('result').appendChild(newDiv);
        }
        
        document.getElementById('clickButton').addEventListener('click', handleClick);
    </script>
</body>
</html>

Common Causes of Single-Use Event Listeners

Problem Cause Solution
Element removed element.remove() in handler Don't remove the element
Element replaced innerHTML replacing parent Use appendChild() instead
Using once: true Listener configured for single use Remove once option
Removing listener removeEventListener() called Don't remove unless needed

Advanced Example with Event Delegation

For dynamically created buttons, use event delegation on a parent element:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Event Delegation Example</title>
</head>
<body>
    <div id="container">
        <button class="clickable">Button 1</button>
        <button class="clickable">Button 2</button>
    </div>
    <button id="addButton">Add New Button</button>
    <div id="log"></div>

    <script>
        // Event delegation - works for existing and future buttons
        document.getElementById('container').addEventListener('click', function(event) {
            if (event.target.classList.contains('clickable')) {
                const log = document.getElementById('log');
                log.innerHTML += `<p>${event.target.textContent} clicked!</p>`;
            }
        });

        // Add new buttons dynamically
        let buttonCount = 2;
        document.getElementById('addButton').addEventListener('click', function() {
            buttonCount++;
            const newButton = document.createElement('button');
            newButton.className = 'clickable';
            newButton.textContent = `Button ${buttonCount}`;
            document.getElementById('container').appendChild(newButton);
        });
    </script>
</body>
</html>

Debugging Event Listener Issues

To check if your event listener is still attached:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Debug Event Listeners</title>
</head>
<body>
    <button id="debugButton">Debug Button</button>
    <div id="debug"></div>

    <script>
        const button = document.getElementById('debugButton');
        
        function clickHandler() {
            const debug = document.getElementById('debug');
            debug.innerHTML += '<p>Button clicked at: ' + new Date().toLocaleTimeString() + '</p>';
            
            // Check if element still exists
            console.log('Button still in DOM:', document.contains(button));
        }
        
        button.addEventListener('click', clickHandler);
        
        // Verify listener was added
        console.log('Event listener added successfully');
    </script>
</body>
</html>

Conclusion

The addEventListener() method works multiple times by default. If it stops working, check if the element is being removed, replaced, or if you're accidentally removing the event listener. Use event delegation for dynamically created elements.

Updated on: 2026-03-15T23:18:59+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements