2013-02-12 103 views
2

我需要做的是使用委託在每個匹配元素上獲得jQuery.one的功能。是否有解除每個元素實例上的委託事件的方法?

正如你可以看到點擊鏈接「巴茲」或「蝙蝠」附加的「(刪除)」多次。另一方面,單擊「Foo」鏈接只執行一次代碼,但是也禁用「Bar」(反之亦然)。

小提琴:http://jsfiddle.net/JcmpN/

我希望發生的是,點擊任何一個執行該元素的處理程序,但保留其他完好,直到他們也被點擊一次。

HTML:

<ul id="product-list"> 
    <li> 
    <span class="product-name">Foo</span> 
    <a href="#remove-foo" class="removeWithOne">Remove Product</a> 
    </li> 
    <li> 
    <span class="product-name">Bar</span> 
    <a href="#remove-bar" class="removeWithOne">Remove Product</a> 
    </li> 
    <li> 
    <span class="product-name">Baz</span> 
    <a href="#remove-baz" class="removeWithOn">Remove Product</a> 
    </li> 
    <li> 
    <span class="product-name">Bat</span> 
    <a href="#remove-bat" class="removeWithOn">Remove Product</a> 
    </li> 
</ul> 

的jQuery:

// this version removes the handler as soon as any instance is clicked! 
$('#product-list').one('click.productRemoveOne', 'a.removeWithOne', function (e) { 
    var $this = $(this), 
     $name = $this.siblings('span.product-name'); 

    e.preventDefault(); 

    $name.text($name.text() + ' (removed)'); 
}); 

// this one executes the handler multiple times! 
$('#product-list').on('click.productRemoveOn', 'a.removeWithOn', function (e) { 
    var $this = $(this), 
     $name = $this.siblings('span.product-name'); 

    e.preventDefault(); 

    $name.text($name.text() + ' (removed)'); 
}); 
+0

這是你在找什麼? http://jsfiddle.net/j08691/JcmpN/1/ – j08691 2013-02-12 22:17:25

回答

1

簡單地使元素不再匹配選擇:http://jsfiddle.net/JcmpN/3/

$('#product-list').on('click.productRemoveOn', 'a.removeWithOn:not(.ignore)', function (e) { 
    var $this = $(this).addClass("ignore"), 
    ... 
+0

最好在偵聽器中使用.one()或$ this.off(e)。 – Savageman 2013-08-08 16:43:55

0

對個人跨度認沽的ID,在那麼你處理程序添加:

rowref=$(this).attr("id"); 
$('#'+rowref).click(function(){event.stopImmediatePropagation()} 

使委託處理程序保持不變,但在事件到達之前攔截該事件。

相關問題