我试图在高阶函数中使用$.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()?
答案 0 :(得分:0)
是的,有可能。
您可以执行$.fn.show.call($("some-elements"))
。
我还没有完全讲完您更详尽的示例,但这似乎正是您想要的。对于最后一个示例,您可以将内容编写为:
multiMap($.fn.show, [_id, _children], "hideMyFamily")
然后在mutliMap中执行f.call
或类似的操作,我相信这会起作用。