AddEventListener calls a function without me even asking for it

So we have a page:

<span id='container'>
    <a href='#' id='first'>First Link</a>
    <a href='#' id='second'>Second Link</a>
</span>

And want to add some click events:

first.addEventListener('click', function(){alert('sup!');})

It works like a charm! However, when you make the second argument an external function:

function message_me(m_text){
    alert(m_text)
}

second.addEventListener('click', message_me('shazam'))

It calls the function immediately. How can i stop this? So annoying!

Here's a live demo: http://jsfiddle.net/ey7pB/1/

+12
source share
4 answers
function message_me(m_text){
    alert(m_text)
} 

second.addEventListener('click', 
    function() {
        message_me('shazam');
    }
);

Here's the updated fiddle .

+11
source

, . ( undefined..., , - alert ). ( ), , .

:

function message_me(m_text){
    alert(m_text);
}

second.addEventListener('click', function () {
    message_me('shazam')
});

:

function message_me(m_text){
    return function () {
        alert(m_text);
    };
}

second.addEventListener('click', message_me('shazam'));

: http://jsfiddle.net/tcCvw/

+11

or you can use .bind

function message_me(m_text){
    alert(m_text);
}

second.addEventListener('click', message_me.bind(this, 'shazam'));

check MDN documentation for "faults"

+7
source

Modern ES6 solution using arrow functions

second.addEventListener('click', () => message_me('shazam'))
0
source

All Articles