prototype.jsの$$関数 ColorMatrixFilterで画像をグレースケールにする(AS2.0)
2月 09

たとえば、

<div class="readme">続きを読む</div>
<div class="readme">続きを読む</div>
<div class="readme">続きを読む</div>

という構造で、readmeクラスをもつ要素に対し、いちいち onClick=”…”とインラインで記述していくのは面倒だし、コードが汚くなる。そこで、prototype.jsの$$関数を用いて、
[js]
var obj = $$(’div.readme’);
[/js]
とやると、該当のオブジェクトを取得できるのは、prototype.jsの$$関数で書いてあるとおり。

そこに、イベントハンドラを割り当てる方法として、
Think ITにて、amachangが書いてる方法とほぼ同じなのだけれど、
[js]

hoge
hoge
hoge


[/js]

自分は、こう書いてみた。

[js]
var objs = $$("div.readme");

$A(objs).each(
function(o){
Event.observe(o, 'click', eventHandler, false);
}
);
[/js]
$A関数で配列にアクセスし、イテレータを使う方法。

でも、正直、こっちのほうが楽だしわかりやすいな…
[js]
for (var i = 0; i < elements.length; i ++) {
elements[i].observe('click', eventHandler);
}
[/js]

最近(?)のJavaScriptは、1つの処理を行うのにたくさんの方法(記載法)があり、悩んでしまう。豆にリファレンスに目を通しておくしかないよなぁ、、

Popularity: 8% [?]

written by ANN

add to hatena hatena.comment (2) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 2

4 Responses to “特定クラスに一括して関数(イベントハンドラ)を登録する方法”

  1. joy-pop Says:

    つたない予想だけど、可読性ってのもあると思うし、取得した要素群に$Aを利用すると、結局要素分ループして配列にしなおすという余分な処理が追加されてしまうから使ってないんじゃないかな?

    しかしJSONみたいなのもあるし、クラスっぽく?もできるし、本当に色々書き方あるよね。

  2. ANN Says:

    というか、僕が書いたのは、Think ITの記事を見る前で、Think ITの記事を見るまで、
    elements[i].observe()
    で、エレメント(オブジェクト)への関数登録ができると、単純に知らなかったのと、
    $$()で取り出したので、同じく、prototype.jsの関数で取り出さないとだめなのかなーと勝手に考えてました。

    しかし、これくらいの処理だと、elements[i].observe()のほうが楽だし、わかりやすいです。

    あと、イテレータについては、正直、よくわかってないですが、forでループを回すのは古いというか、より抽象化するためにイテレータを使うのがよろしい、みたいな雰囲気ですかねー

    デザパタにもあるので、理解しようと努力はしてますが、PHPの言語自体にその機能がないので、どうしても覚えづらいですね。(他の言語には標準であるようです)

  3. ANN Says:

    ↑あ、PHP5から、イテレータ、ありますね。失礼しました。

  4. ゲンゾウ Says:

    $$(”div.readme”).each(function(div){
    div.observe(”click”, eventHandler);
    });
    というのは?

Leave a Reply