“click”/“dblclick”上同一类的不同功能

时间:2010-03-28 13:04:13

标签: javascript jquery

这是我的两个功能,单击它工作正常,但在dblclick这两个函数执行,任何想法?我尝试使用live而不是delegate但仍然在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;
});

2 个答案:

答案 0 :(得分:5)

来自API文档:

  

不建议将处理程序绑定到同一元素的click和dblclick事件。触发的事件序列因浏览器而异,其中一些接收两个点击事件,另一些只接收一个。如果无法避免对单击和双击做出不同反应的界面,则应在单击处理程序中模拟dblclick事件。我们可以通过在处理程序中保存时间戳,然后将当前时间与后续点击时保存的时间戳进行比较来实现此目的。如果差异足够小,我们可以将点击视为双击。

我认为这意味着你要在超时处理程序中执行click操作。如果再次单击,并且尚未发生超时处理程序,则取消超时并执行dblclick代码。

答案 1 :(得分:1)

正如Pointy所指出的那样,同一元素上的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毫秒内单击两个不同的元素,它可能会导致一些奇怪的行为,但这应该至少给你一些想法。