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 有什么方便的方法来做到这一点,所以我会一直运行 hide()$("#hideMyFamily").children()等等$("#hideMyFamily").children().children(),直到集合的长度为 0($("#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 有没有一种方便的方法可以在节点/集合上使用 jQuery 的函数,如 show() 和 hide() $.fn.show( $("someElements") )

4

1 回答 1

0

对的,这是可能的。你可以做到$.fn.show.call($("some-elements"))

我还没有完全完成你更详细的例子,但这似乎是你正在寻找的。对于你的最后一个例子,你可以这样写:

multiMap($.fn.show, [_id, _children], "hideMyFamily")

然后在 mutliMap 做f.call或类似的事情,我相信这会奏效。

于 2018-08-02T18:54:49.787 回答