DHTMLで子を探す、親を捜す

結構よくある処理だとおもう。

function searchParent(e,f){
  return e && (f(e)?e:searchParent(e.parentNode,f)) ;
}
function searchChild(e,f){
  return e && (f(e)?e:(searchChild(e.firstChild,f) || searchChild(e.nextSibling,f)));
}
searchChild
エレメントeの子ツリー内を順番に*1探し、最初に関数f(ノード)がtrueになるものを返す。無ければnull
searchParent
親を順番に捜し、関数f(ノード)がtrueになるものを返す。無ければnull
tagNameEqual = function(e,tagName){ return e.tagName==tagName; }
elementHasClass = function(e,className){ return e.className && (" "+e.className+" ").indexOf(" "+className+" ")!=-1; }
searchParentByTagName = function(e,tagName){ return searchParent(e,function(n){return tagNameEqual(n,tagName)}); }
searchChildByClassName = function(e,className){ return searchChild(e,function(n){return elementHasClass(n,className)}); }

何となく綺麗にかけた! function と return がもっと短くかけるといいのになぁ。

修正(2006/05/13 01:43)

すいません、動きませんでした。関数の合成ってやつを試していたときのコードだったのです…修正しました

*1:子の子、子がいない、あるいは一巡すれば次の兄弟、その子、という順番