の簡単なJSイベントを考えてみましょう
document.getElementsByClassName('test')[0].onclick=function(){
document.getElementsByClassName('test')[0].innerHTML = 'New Text';
}
このコードを拡張して、class="test"
を含むすべての要素で一般的に機能するようにするにはどうすればよいですか。要素をクリックして、そのコンテンツを置き換えることを意味します。実際、クリックイベントからノード番号(括弧内に提供)を取得する必要があります。
JQueryのような実用的な方法ではなく、邪魔にならないコードでJavaScriptをよりよく理解しようとしています。
それらを繰り返すだけです:
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);
}
function() { ... }
の代わりに(function(i) { return function() { ... }; })(i)
を使用しました。コールバックでi
を使用した場合、i
の値は、呼び出すときにelements.length - 1
になるためです。これを修正するには、i
をシャドウイングし、本質的に値渡しにする必要があります。
関数内でthis
を使用するだけです。 this
は、イベントが発生する要素です。
(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);
}
})();
JQueryよりも少し複雑です。
$(".test").click(function() {
$(this).html("New Text");
});
しかし、jQueryが追加する膨張なしで、それは大幅に速くなります;)
var all = document.getElementsByClassName('test');
for(var i=0;i<all.length;i++)
all[i].onclick=function(){
this.innerHTML = 'New Text';
}
しかし、addEventListener(またはIEやOperaの一部のバージョンではattachEvent)を使用することをお勧めします。
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';
}});