9

我已经将点击事件切换到一个节点,我也想将一个 dbclick 事件切换到它。但是,它仅在我对其进行 dbclick 时触发单击事件。

那么如何同时设置两个事件呢?

4

5 回答 5

15

您必须进行“自己的”双击检测

像这样的东西可以工作:

var clickedOnce = false;
var timer;

$("#test").bind("click", function(){
    if (clickedOnce) {
        run_on_double_click();
    } else {
        timer = setTimeout(function() {
           run_on_simple_click(parameter);
        }, 150);
        clickedOnce = true;
    }
});

function run_on_simple_click(parameter) {
    alert(parameter);
    alert("simpleclick");
    clickedOnce = false;
}

function run_on_double_click() {
    clickedOnce = false;
    clearTimeout(timer);
    alert("doubleclick");
}

这是一个有效的JSFiddle

有关应为计时器使用什么延迟的更多信息,请查看此处:如何在元素上同时使用 onclick 和 ondblclick?

于 2013-08-19T06:16:34.283 回答
3
$("#test-id").bind("click dblclick", function(){alert("hello")});

适用于 click 和 dblclick

编辑 -

我认为这是不可能的。我正在尝试这样的事情。

$("#test").bind({
    dblclick: function(){alert("Hii")},
    mousedown: function(){alert("hello")}

});

但是不通过单击就不可能达到双击。我试过鼠标按下,但它没有给出任何解决方案。

于 2013-08-19T06:03:45.623 回答
1

我几乎使用了与 Jeremy D 相同的逻辑。

但是,在我的情况下,使用匿名函数解决这个问题会更整洁,双击超时会慢一点:

dblclick_timer = false
.on("click", function(d) {
    // if double click timer is active, this click is the double click
    if ( dblclick_timer )
    {
        clearTimeout(dblclick_timer)
        dblclick_timer = false
        // double click code code comes here
        console.log("double click fired")
    }
    // otherwise, what to do after single click (double click has timed out)
    else dblclick_timer = setTimeout( function(){
        dblclick_timer = false
        // single click code code comes here
        console.log("single click fired")
    }, 250)
})
于 2014-01-31T11:56:25.393 回答
0

您需要跟踪双击,如果不是双击,请执行单击操作。尝试这个

<p id="demo"></p>
<button id='btn'>Click and DoubleClick</button>
<script>
var doubleclick =false;
var clicktimeoutid = 0;
var dblclicktimeoutid = 0;
var clickcheck = function(e){
    if(!clicktimeoutid)
        clicktimeoutid = setTimeout(function(){
            if(!doubleclick)
                performclick(e);
            clicktimeoutid  =0;
        },300);
}

var performclick =function(e){
     document.getElementById("demo").innerHTML += 'click';  
}
var performdblclick = function(e)
{
    doubleclick = true;
    document.getElementById("demo").innerHTML += 'dblclick';
    dblclicktimeoutid  = setTimeout(function(){doubleclick = false},800);
};
document.getElementById("btn").ondblclick = performdblclick;
document.getElementById("btn").onclick=clickcheck;
</script>
于 2013-08-19T06:44:39.820 回答
0

一种稍微不同的方法 - 实际的点击比较发生在 timeOut 函数的后面,在预设的时间间隔之后......直到那时我们只需关注标志。

& 通过一些简单的修改(点击计数器而不是标志),它也可以扩展到任意数量的快速连续点击(三次点击等),但受实用性限制。

var clicked = false,
    dblClicked = false,
    clickTimer;



function onClick(param){
    console.log('Node clicked. param - ',param);
};

function onDoubleClick(param){
    console.log('Node Double clicked. param - ',param);
};

function clickCheck(param){
    if (!clicked){
        clicked = true;
        clickTimer = setTimeout(function(){
            if(dblClicked){
                onDoubleClick(param);
            }

            else if(clicked){
                onClick(param);
            }

            clicked = false;
            dblClicked = false;
            clearTimeout(clickTimer);

        },150);
    } else {
        dblClicked = true;
    }
};
于 2016-08-27T12:07:47.780 回答