2010-03-28 69 views
1

這是我的兩個功能,單同班單擊它工作正常,但DBLCLICK兩個功能執行,任何想法?我試着用live代替delegate但仍兩種功能執行上DBLCLICK不同功能上的「點擊」 /「DBLCLICK」

// Change Status on click 
$(".todoBox").delegate("li", "click", function() { 
    var id = $(this).attr("id"); 
    $.ajax({    
     //ajax stuff 
}); 

return false; 
}); 



// Double Click to Delete 
$(".todoBox").delegate("li", "dblclick", function(){ 
    var id = $(this).attr("id"); 
    $.ajax({ 
     //ajax stuff 
    }); 

return false; 
}); 
+3

我很抱歉,但雙擊刪除是一個可怕的接口。太容易意外調用它。充其量,最終會有人詛咒你,因爲他們不得不放棄確認對話框 - 但你似乎沒有使用確認對話框 - 當他們意外地雙擊該項目時。破壞性行爲應該使用一個單獨的,明確可識別的界面,這個界面很難被意外調用。 – tvanfosson 2010-03-28 13:10:00

+0

我同意,@tv - 個人我真的不擅長雙擊,除非我不想雙擊! – Pointy 2010-03-28 13:14:24

回答

5

從API文檔:

是不可取的處理程序綁定到既爲同一元素的點擊DBLCLICK事件。觸發事件的順序因瀏覽器而異,其中一些接收兩個點擊事件,而另一些事件則只有一個。如果無法避免對單擊和雙擊有不同反應的界面,則應在點擊處理程序中模擬dblclick事件。我們可以通過在處理程序中保存時間戳,然後將當前時間與隨後點擊中保存的時間戳進行比較來實現此目的。如果差異足夠小,我們可以將點擊視爲雙擊。

我認爲這意味着您會在超時處理程序中執行您的click操作。如果再次點擊,超時處理程序尚未發生,則取消超時並執行dblclick代碼。

1

由於尖指出,相同的元素clickdblclick可能會非常棘手,這裏是你如何能「假」它使用setTimeout的實現:

var clickTimeout = false; 
$('#element').click(function() { 

    if(clickTimeout !== false) { 
     // I'm doubleclick! 
     clearTimeout(clickTimeout); 
     clickTimeout = false; 
    } else {   
     clickTimeout = setTimeout(function() { 
      // I'm click! 
      clickTimeout = false; 
     }, 400); 
    } 
}); 

基本上這意味着,如果用戶點擊再次400毫秒內相同的元素,這是一個雙擊。請注意,在這種情況下,clickTimeout變量是全局的,將影響所有元素,因此它可能會導致一些奇怪的行爲,如果用戶點擊內400毫秒兩種不同的元素,但是,這將給你至少一些想法。

+1

您可以始終在閉包中構建處理程序,並在其中聲明clickTimeout變量。 – Pointy 2010-03-28 13:55:08