2つのアラートが表示されている場合は、ダブルクリックを検出するためのしきい値が小さすぎるように見えます。 150〜300msを増やしてみてください。
また、クリックとdblclickが実行される順序が保証されているかどうかはわかりません。したがって、あなたのdblclickが起動されると、最初のクリックイベントがクリアされますが、2回目のクリックイベントよりも前に発生した場合、この2番目のイベントは引き続き発生し、クリックイベントの発射とシングルクリックイベントの発射が含まれます。
1)実際にダブルクリックしてイベントを発射するための別のタイムアウトを設定します。
私はこの潜在的な問題には2つの可能な解決策を参照してください。ダブルクリックイベントが起きようとしていることをコードに記録します。次に、2回目のシングルクリックイベントが発生すると、この状態を確認して「いいえ、何もしません」というメッセージが表示されます。
2)2番目の方法は、ターゲット関数をスワップすることですクリックイベントに基づいてこれは次のようになります。
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can stop it
if(firing)
return;
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
el.ondblclick = function() {
firingFunc = doubleClick;
// Now, when the original timeout of your single click finishes,
// firingFunc will be pointing to your doubleClick handler
}
}
基本的には、設定した元のタイムアウトをそのままにしておきます。それは常にfiringFunc()を呼び出します。変更されるのは、firingFunc()が実際に指しているものだけです。ダブルクリックが検出されると、doubleClickに設定されます。タイムアウトが終了すると、常にsingleClickに戻ります。
また、「発砲」変数があり、2回目のシングルクリックイベントを傍受することがわかっています。
別の選択肢は完全にDBLCLICKイベントを無視し、ただ一つのクリックやタイマーでそれを検出することである。
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can set it to doubleClick
if(firing){
firingFunc = doubleClick;
return;
}
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
}
これは未テストです:)
あなたがシングルクリックのアラートを取得するとき、それは常に2つずつある、またはあなたが時々だけ1つのアラートを得るのですか? – Matt
時々私はただ一つしか得ることができません。 –