2010-03-28 65 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