Consider a simple JS event of
document.getElementsByClassName('test')[0].onclick=function(){
document.getElementsByClassName('test')[0].innerHTML = 'New Text';
}
How can I extend this code to generally work for all elements with class="test"
. I mean getting the element clicked and replace its content. In fact, we need to get the node number (provided inside the bracket) from the click event.
I am trying to better understand javascript in unobtrusive codes, not a practical method like jQuery.
Just iterate over them:
var elements = document.getElementsByClassName('test');
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener('click', (function(i) {
return function() {
this.innerHTML = 'New Text';
};
})(i), false);
}
I used (function(i) { return function() { ... }; })(i)
instead of just function() { ... }
because if you happen to use i
in the callback, the value of i
will be elements.length - 1
by the time you call it. To fix it, you must shadow i
and make it essentially pass by value.
Just use this
inside the function. this
will be the element on which the event is being fired.
(function() {
var elms = document.getElementsByClassName("test"),
l = elms.length, i;
for( i=0; i<l; i++) {
(function(i) {
elms[i].onclick = function() {
this.innerHTML = "New Text";
};
})(i);
}
})();
It's a bit more complicated than jQuery's:
$(".test").click(function() {
$(this).html("New Text");
});
But it'll be significantly faster without the bloat that jQuery adds ;)
var all = document.getElementsByClassName('test');
for(var i=0;i<all.length;i++)
all[i].onclick=function(){
this.innerHTML = 'New Text';
}
But it's most recommended to use addEventListener (or attachEvent, in IE/Some versions of Opera, I guess):
var all = document.getElementsByClassName('test');
for(var i=0;i<all.length;i++)
all[i].addEventListener('click',function(){//If you're gonna use attachEvent, use 'onclick' instead of 'click'
this.innerHTML = 'New Text';
}});
来源:https://stackoverflow.com/questions/11075819/how-to-get-current-element-in-getelementsbyclassname