1

$.fn.show高階関数内で (および他の jQuery 関数)を使用しようとしていました。

私がもともと欲しかったのは、特定の要素に適用される他の関数のコレクションによって返されるすべての要素に特定の関数を適用する関数でした。次のようになります。

function mapOn( func, genratingFunc, element ){
    $(generatingFuncs).each(function(){
        var buf = $(element);
        while(buf.length){ // run as long as elements are returned
            func(buf);
            buf = this(buf);
        }
    });
}

便利で表現力豊かな方法で、いくつかの関数をいくつかの DOM ノードとその親および/または子に適用するには、このような関数が必要でした。ID hideMyFamilyとその子を持つノードを非表示にしたいとしましょう。jQuery でこれを行う便利な方法がわからないので、コレクションの長さが 0になるまで(もちろんそれ自体も) hide()$("#hideMyFamily").children()などを実行します。問題は、要素/コレクション に適用できないように見えるため 、実行しても機能しません。$("#hideMyFamily").children().children()$("#hideMyFamily")
mapOn( $.fn.show, [$.fn.children], $("#hideMyFamily") )$.fn.show

だから私が思いついたのはこれです:

jQuery の関数ごとに、次のような別の関数 (グローバル スコープ内) を指定する必要があります。

function _show(e){ $(e).show(); }

jQuery の「生成」関数ごとに、別の「回避関数」を指定します。

function _id(e){ return $(e); }
function _children(e){ return $(e).children(); }

そして、次のような「multiMap」関数を指定できます。

function multiMap(func, generators, elem){
    $(generators).each(function(){
        var buf = $(elem);
        var buf2 = [];
        while (buf.length && buf[0] !== buf2[0]) {
            func(buf);
            buf2 = buf;
            buf = this(buf);
        }
    });
}

これで、便利な関数multiMap(_show, [_id, _children], "hideMyFamily")を実行して、要素自体とそのすべての子を非表示にすることができます。

さて、要点を説明するために、私の質問は次のとおりです。望ましい動作を達成するためのよりエレガントな方法はありますか? 私が考慮しなかったjQueryの魔法はありますか?

tl;dr のような方法で、ノード/コレクションで show() や hide() などの jQuery の関数を使用する便利な方法はあり$.fn.show( $("someElements") )ますか?

4

1 に答える 1