我一直错过 jQuery 中的一个遍历函数,我想可能有一个但我错过了。假设我们有以下标记:
<ul>
<li><a href="#">Foo</a></li>
<li><a href="#">Bar</a></li>
<li><a href="#">John</a></li>
<li><a href="#">Doe</a></li>
</ul>
现在,如果我想向我单击的锚点添加一个活动类并停用其他类,我通常必须这样做:
$('a').click(function() {
$(this).addClass('active')
.parent()
.siblings()
.find('a.active')
.removeClass('active');
});
但我想做的是:
var relation = function() {
return $(this).parent().siblings().find('a.active');
};
$('a').click(function() {
$(this).addClass('active').find(relation).removeClass('active');
});
看到不同?现在,find
不把函数作为参数,所以我写了这样的东西:
$.fn.traverse = function(fn) {
return $.isFunction(fn) ? fn.call(this) : this;
};
例如,这个简单的方法可以创建一个“激活”插件,让作者指定与停用的关系:
$.fn.activate = function(fn) {
return this.each(function() {
$(this).addClass('active').traverse(fn || function() {
return $(this).siblings();
}).removeClass('active');
});
});
并像这样使用它:
$('a').activate(function() {
return $(this).parent().siblings().find('.active');
});
// or
$('a').activate(function() {
return $(this).closest('ul').find('a.active').not(this);
});
// or
$('li').activate();
这将完成这项工作。但我的问题是,jQuery 中确实应该包含类似的东西,不是吗?我正在看,.map
但它不起作用。