使用委托事件(即使用$(document).on("click.myButtons", "a.foo-button", ...
处理程序)的问题不直接附加到 a 元素。这意味着不可能从一个 a 元素中删除处理程序并将它们留在其他 a 元素上。您要么必须从所有 a 元素中删除处理程序,要么不必。
在您的情况下,您必须通过将处理程序直接链接到 a 元素来使用直接处理程序。以下代码正在做您想要实现的目标:
$( function() {
myButtonsFunction = function(event){
// Do some stuff with event.data['foobar'],
console.log( event.data['foobar'] );
// Do some other stuff
// Remove handlers in the same container
$( event.target ).siblings( "a" ).addBack().off("click.myButtons", myButtonsFunction);
return false;
}
$( "a.foo-button" ).on("click.myButtons", {foobar: 123}, myButtonsFunction);
$( "a.bar-button" ).on("click.myButtons", {foobar: 456}, myButtonsFunction);
} );
处理程序直接绑定到按钮。如果单击按钮,则处理程序将从与单击的按钮位于同一容器中的所有按钮中删除。
编辑
我认为下面的代码反映了您的预期功能:
$( function() {
myButtonsFunction = function(event){
// Do some stuff with event.data['foobar'],
console.log( event.data['foobar'] );
// Do some other stuff
$( event.target ).siblings( "a" ).addBack().each( function( i, elt ) {
$( elt ).removeClass( $( elt ).data( 'class' ) );
} );
return false;
}
$(document).on("click.myButtons", "a.foo-button", {foobar: 123}, myButtonsFunction);
$(document).on("click.myButtons", "a.bar-button", {foobar: 456}, myButtonsFunction);
} );
我所做的如下:我为每个链接元素添加了一个数据属性。如果单击链接,此数据属性包含将从链接元素中删除的类名。如果从链接中删除该类并且稍后单击该链接,则将不再调用处理程序。
编辑 2
也许是一个更整洁的解决方案:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
$( function() {
myButtonsFunction = function(event){
// Do some stuff with event.data['foobar'],
console.log( event.data['foobar'] );
// Do some other stuff
$( event.target ).siblings( "a" ).addBack().removeAttr( 'data-delegate' );
return false;
}
$(document).on("click.myButtons", "a[data-delegate=foo]", {foobar: 123}, myButtonsFunction);
$(document).on("click.myButtons", "a[data-delegate=bar]", {foobar: 456}, myButtonsFunction);
} );
</script>
<li class="container">
<a href="#" class="foo-button" data-delegate="foo">Foo Button</a>
<a href="#" class="bar-button" data-delegate="bar">Bar Button</a>
</li>
<li class="container">
<a href="#" class="foo-button" data-delegate="foo">Foo Button</a>
<a href="#" class="bar-button" data-delegate="bar">Bar Button</a>
</li>
<li class="container">
<a href="#" class="foo-button" data-delegate="foo">Foo Button</a>
<a href="#" class="bar-button" data-delegate="bar">Bar Button</a>
</li>
我希望这可以进一步帮助您。