在/作为高阶函数使用jQuery函数

时间:2013-10-22 16:29:38

标签: javascript jquery html higher-order-functions

我试图在高阶函数中使用$.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做任何方便的方法,所以我会在$("#hideMyFamily").children()$("#hideMyFamily").children().children()上运行hide(),依此类推,直到集合的 length 为止是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是否有一种方便的方法可以像$.fn.show( $("someElements") )那样在节点/集合上使用jQuery的函数,如show()和hide()?

1 个答案:

答案 0 :(得分:0)

是的,有可能。 您可以执行$.fn.show.call($("some-elements"))

我还没有完全讲完您更详尽的示例,但这似乎正是您想要的。对于最后一个示例,您可以将内容编写为:

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

然后在mutliMap中执行f.call或类似的操作,我相信这会起作用。