20

I know this is easily done in jQuery or any other framework, but that's not really the point. How do I go about 'properly' binding a click event in pure javascript? I know how to do it inline (I know this is terrible)

<a href="doc.html" onclick="myFunc(); return false">click here</a>

and this causes my javascript to execute for a JS enabled browser, and the link to behave normally for those without javascript?

Now, how do I do the same thing in a non-inline manner?

1
  • 3
    The way you're doing it there is not terrible. It certainly has disadvantages but it also has advantages over all the other methods (not requiring the document to load before it will work being the main one). Don't let yourself be brainwashed by the propaganda of unobtrusiveness. Commented Jun 3, 2010 at 13:17

6 Answers 6

30

If you need to assign only one click event, you can assign onclick:

If you have an ID:

myAnchor = document.getElementById("Anchor");
myAnchor.onclick = function() { myFunc(); return false; }

you can also walk through all anchors:

anchors = document.getElementsByTagName("a");

for (var i = 0; i < anchors.length; i++) {   

 anchors[i].onclick = .....

}

There's also a document.getElementsByClassName to simulate jQuery's class selector but it is not supported by all browsers.

If it could be that you need to assign multiple events on one element, go with addEventListener shown by @Jordan and @David Dorward.

Sign up to request clarification or add additional context in comments.

2 Comments

What is the difference between using onClick property and addEventListener function? Which is better? I believe there is also a click function, so could you also do myAnchor.click = (event) => ...?
@LukeTO'Brien in short: onClick property can be overwritten while addEventListener can be used multiple times for binding to the same event on the same element. See this nice answer here: stackoverflow.com/questions/6348494/addeventlistener-vs-onclick
10

The basic way is to use document.getElementById() to find the element and then use addEventListener to listen for the event.

In your HTML:

<a href="doc.html" id="some-id">click here</a>

In your JavaScript:

function myFunc(eventObj) {
  // ...
}

var myElement = document.getElementById('some-id');
myElement.addEventListener('click', myFunc);

Or you can use an anonymous function:

document.getElementById('some-id').addEventListener('click', function(eventObj) {
  // ...
});

3 Comments

Remember that IE does not support addEventListener - you have to use attachEvent instead.
IE has addEventListener since IE9. You have to decide for yourself if you want to build web apps for users using < IE9. All other major browser-device combo do support addEventListener. Source: caniuse.com/#search=addEventListener
there is a typo kindly fix the method name, it is getElementById and not getElementyById.
6

This is a nice cross-browser method

var on = (function(){
    if ("addEventListener" in window) {
        return function(target, type, listener){
            target.addEventListener(type, listener, false);
        };
    }
    else {
        return function(object, sEvent, fpNotify){
            object.attachEvent("on" + sEvent, function(){
                fpNotify(window.event);
            });
        };
    }
}());


on(document.getElementById("myAnchor"), "click", function(){
    alert(this.href);
});

Comments

4

The standard go to for this question is on Quirks Mode: http://www.quirksmode.org/js/events_advanced.html

Comments

4

Give it an ID and you should be able to do:

document.getElementById("the id").onclick = function{ ... }

1 Comment

Short, sweet, and to the point. Answered the question directly with no fluff. +1
0

You don't have to use jQuery, but you could try John Resig's popular addEvent funciton.

addevent(elem, "click",clickevent);  

function addEvent ( obj, type, fn ) {
      if ( obj.attachEvent ) {
        obj["e"+type+fn] = fn;
        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
        obj.attachEvent( "on"+type, obj[type+fn] );
      } else
        obj.addEventListener( type, fn, false );
    }

There are more to be considered to'properly' bind an event on HTML tags in pure javascript.

http://www.pagecolumn.com/javascript/bind_event_in_js_object.htm

1 Comment

This is not a good method as it depends on the Functions toString actually returning the functions body for the event handling. This is not guaranteed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.