2012-08-08 62 views
2

我有錨的陣列多個點擊,我綁定事件到每一個:防止在元件(JQuery的)

$j('.opts a').live("click", function(e){}) ; 

我想從被點擊,直到該點擊事件具有停止其他錨完了。

$j('.opts a').live("click", function(e){ 
    $j('.opts a').unbind('click'); 
    //do something 
    $j('.opts a').bind('click'); 
}); 

這只是我嘗試過的一件事情的一個例子,但即使解除綁定也不起作用。

+0

@JamesMcLaughlin:但用戶不是單線程的,所以她可以用鼠標並行觸發事件。 – 2012-08-08 14:13:28

+0

@AaronDigulla你是對的,沒關係。 – 2012-08-08 14:18:18

回答

2

您無法真正保持鏈接不被點擊。你只能解除你註冊的任何JS事件。您需要確保撥打preventDefault(),否則鏈接將會跟隨其href

嘗試類似這樣的東西。

var isDoingSomething = false; 
$j('.opts a').on('click', function (e) { 
    e.preventDefault(); 
    if (!isDoingSomething) { 
     isDoingSomething = true; 
     // do something 
     isDoingSomething = false; 
    } 
}); 

希望這會有所幫助。

+0

正是我想要建議的,包括'.on' - 但可能需要將'.on'綁定到.opts的直接父級以獲得最佳性能。 (不管父母是什麼) – 2012-08-08 14:18:23

0

- >

$j('.opts a').live("click", function(e){ 
    $j('.opts a').unbind('click'); 
    //do something 
    $j('.opts a').bind('click'); 
}); 

- >

$j(document).on("click", '.opts a', function(e){ 
    $j('.opts a').off('click'); 
    //do something 
    $j('.opts a').on('click', //a function such as 'myClickFunction' referencing what you want to occur.); 
}); 
+0

off()在這種情況下對我來說不起作用 – mononym 2012-08-08 14:40:14

2

我不認爲jQuery是這裏的正確工具。你的問題是,當你的JavaScript做某事時,事件排隊。

所以你真正需要的是類似於「當我返回時吞下所有排隊的點擊事件」。

我建議將點擊處理程序的rebinding移動到一個新的函數中,並在一個定時器中調用它。這允許瀏覽器處理排隊的事件。

也許解綁也是錯誤的方法。如果你總是使用相同的處理程序,把它變成一個對象與skip屬性:

skip: false, 
run: function(e) { 
    if (this.skip) return; 

    this.skip = true; 

    ... do something ... 

    var self = this; 
    setTimeout(function() { self.skip = false; }, 50); 
} 

[編輯]另一種選擇:如果所有的環節都在一個HTML元素(例如父母div或一些東西),你可以爲該元素安裝一個單擊處理程序,它什麼都不做。這也會吞噬點擊事件。您仍然需要超時處理程序來確保事件在您從函數返回後進行處理。

+0

+1提醒我們並非所有的JavaScript問題都是jQuery問題。 – 2012-08-08 14:23:47