【发布时间】:2013-08-20 20:37:31
【问题描述】:
我已经将点击事件切换到一个节点,我也想将一个 dbclick 事件切换到它。但是它只会在我点击它时触发点击事件。
那么如何同时设置两个事件呢?
【问题讨论】:
标签: javascript event-handling d3.js double-click
我已经将点击事件切换到一个节点,我也想将一个 dbclick 事件切换到它。但是它只会在我点击它时触发点击事件。
那么如何同时设置两个事件呢?
【问题讨论】:
标签: javascript event-handling d3.js double-click
$("#test-id").bind("click dblclick", function(){alert("hello")});
适用于 click 和 dblclick
编辑 --
我认为这是不可能的。我正在尝试这样的事情。
$("#test").bind({
dblclick: function(){alert("Hii")},
mousedown: function(){alert("hello")}
});
但是不通过单击就不可能达到双击。我试过鼠标按下,但它没有给出任何解决方案。
【讨论】:
你必须自己做双击检测
类似的东西可以工作:
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
有关应为计时器使用的延迟的更多信息,请查看此处:How to use both onclick and ondblclick on an element?
【讨论】:
您需要跟踪双击,如果不是双击,则执行单击操作。 试试这个
<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>
【讨论】:
我几乎使用了与 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)
})
【讨论】:
一种稍微不同的方法 - 实际的点击比较发生在 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;
}
};
【讨论】: