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:子の子、子がいない、あるいは一巡すれば次の兄弟、その子、という順番