私はいつも 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
が、それはそのように動作しません。