ライブラリに入れる関数の選定

KEM.jsに入れるべき関数を選定する。

込み入った処理などはjQueryにやらせればいい(jQueryが使えない環境では込み入った処理はやらない)ので、jQueryを使うまでもないような処理ができれば。

例えば、画像のロールオーバー処理なんかはいちいちjQueryを使うまでもない気がしているので、それに必要そうな処理を考える。

タグ名やIDを指定しての要素取得

CSSセレクタを解釈させようとすると大変なので、要素名、クラス名、ID属性くらいに対応させる。一つの関数で引数に応じて処理を分けるようにして、戻り値は常にArrayとする。

さらに、引数末尾にFunctionを指定すると、取得できた要素についてeachみたいなことができるようにする。それと、親要素も指定できるように。

KEM.elements('#ID', function(e){});
KEM.elements('IMG', function(e){});
KEM.elements('IMG', 'rollover', function(e){});
KEM.elements(E, '#ID', function(e){});
KEM.elements(E, 'IMG', function(e){});
KEM.elements(E, 'IMG', 'rollover', function(e){});

子要素だけを取得することもできるように。

KEM.children(E, 'IMG', function(e){});
KEM.children(E, 'IMG', 'rollover', function(e){});

親要素も。これは戻り値は要素 or nullで、Functionもとらなくていいか。

KEM.parent(E);
KEM.parent(E, 'IMG');

イベントハンドラの設定

イベント名を指定するか、Objectリテラルを使えるようにする。

KEM.addEvent(E, 'click', function(){});
KEM.addEvent(E, {
  click: function(){},
  mousedown: function(){}
});

実装はaddEventListenerかattachEventで。イベントの解除とか順番とかは気にしない。

クラス(className)の操作

add/remove/hasがあれば十分。

KEM.addClass(E, 'foo var');
KEM.removeClass(E, 'foo var');
KEM.hasClass(E, 'foo var');

hasClassで複数指定の場合はANDで。

別のスクリプトスタイルシートのローディング

面倒なので単にHTMLを出力する方法で。

KEM.loadScript('foo.js', {charset: 'UTF-8'});
KEM.loadStyle('foo.css', {charset: 'UTF-8', media: 'screen,tv'});

Functionかどうか

引数にFunctionを取るものが多いので、それがFunctionかどうかを判別出来る関数も作っておくのが良さそう。

KEM.isFunction(x);

実装はtypeofとconstructorで。

ところで、typeof /RegExp/がfunctionを返すのはなぜ?あとで調べる。

ロールオーバーの実装

で、上記の関数を使ってロールオーバーを実現するとこんな感じのコードに。仕様はとりあえずIMG.rolloverについて、マウスオーバーでIMG要素にhoverクラスを追加、マウスアウトでhoverクラスを削除、としておく。

まずはjQueryでやるとこんな感じ。

$('IMG.rollover').
  mouseover(function() { $(this).addClass('hover'); }).
  mouseout(function() { $(this).removeClass('hover'); });

KEM.jsだとこんな感じに。

KEM.elements('IMG', 'rollover', function(e) {
  KEM.addEvent(e, 'mouseover', function(){ KEM.addClass(e, 'hover'); });
  KEM.addEvent(e, 'mouseout', function(){ KEM.removeClass(e, 'hover'); });
});

この方向で関数についてまとめるのが次の作業。