I'm trying to achieve the equivalent of:
$('div').on('click', function() {
// Do something
});
But without jQuery. My initial thought was to use a for
loop to iterate over all elements in the set, but my guess is there's a better way of achieving this without using a loop (some native method?).
var elems = document.getElementsByTagName('div');
function someEvent() { // Generic function to test against
alert('event fired');
}
for (var i=0, j = elems.length; i < j; i += 1) {
elems[i].addEventListener("click", someEvent);
}
Is there a more elegant way of doing this without the inclusion of a library?
What you want is event delegation. It works by binding a single event to a parent of multiple nodes, and analyzing the event's target node. For example, you can bind onmouseup
to the body
node, and when it is triggered from releasing the mouse on a div
node, the body
event object will contain that div
in the target
property. You can analyze the target to make sure it matches certain criterias.
A better way to explain this, is to just provide a working example.
document.body.onmouseup = function (event) {
var target = event.target || event.toElement;
if (target.nodeName.toLowerCase() == "div") {
alert(target.childNodes[0].nodeValue);
};
};
The main point of interest with this example is the target
variable, and the condition to verify that our target
is a div
. The condition can even be a className
or anything your heart desires.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With