liにidのボタンが1つあります"my_id"
。この要素で2つのjQueryイベントをアタッチしました
1。
$("#my_id").click(function() {
alert('single click');
});
2。
$("#my_id").dblclick(function() {
alert('double click');
});
しかし、それはいつも私に single click
liにidのボタンが1つあります"my_id"
。この要素で2つのjQueryイベントをアタッチしました
1。
$("#my_id").click(function() {
alert('single click');
});
2。
$("#my_id").dblclick(function() {
alert('double click');
});
しかし、それはいつも私に single click
回答:
最初のクリックの後に別のクリックがあるかどうかを確認するには、タイムアウトを使用する必要があります。
ここにトリックがあります:
// Author: Jacek Becela
// Source: http://gist.github.com/399624
// License: MIT
jQuery.fn.single_double_click = function(single_click_callback, double_click_callback, timeout) {
return this.each(function(){
var clicks = 0, self = this;
jQuery(this).click(function(event){
clicks++;
if (clicks == 1) {
setTimeout(function(){
if(clicks == 1) {
single_click_callback.call(self, event);
} else {
double_click_callback.call(self, event);
}
clicks = 0;
}, timeout || 300);
}
});
});
}
使用法:
$("button").single_double_click(function () {
alert("Try double-clicking me!")
}, function () {
alert("Double click detected, I'm hiding")
$(this).hide()
})
<button>Click Me!</button>
編集:
以下で説明するように、ネイティブdblclick
イベントを使用することをお勧めします:http : //www.quirksmode.org/dom/events/click.html
またはjQueryによって提供されるもの:http : //api.jquery.com/dblclick/
dblclick
イベントに依存する方が安全だ
dblclick
今日行くための絶対的な方法です。jQueryもこのイベントを処理します:api.jquery.com/dblclick
dblclick
イベントの動作はQuirksmodeで説明されています。
のイベントの順序は次のdblclick
とおりです。
このルールの1つの例外は、(もちろん)Internet Explorerで、次のカスタム順序があります。
ご覧のとおり、同じ要素で両方のイベントを一緒にリッスンすると、click
ハンドラーが余分に呼び出されます。
dblclick
信頼できるかどうかはわかりません... 1回クリックした場合... 1〜2秒待ってからもう一度クリックするとdblclick
、2回目のクリックでイベントが発生します。
より多くのアドホック状態とsetTimeoutを利用する代わりにdetail
、event
オブジェクトからアクセスできるというネイティブプロパティがあることがわかりました!
element.onclick = event => {
if (event.detail === 1) {
// it was a single click
} else if (event.detail === 2) {
// it was a double click
}
};
最新のブラウザ、さらにはIE-9でもサポートされています:)
ソース:https : //developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
if(evt.detail !== 1) return;
偶発的な二重を拒否するようなことをしますクリックすると、マウスを使用していないユーザーがそのボタンにアクセスできなくなります。
シンプルな機能。jqueryやその他のフレームワークは必要ありません。関数をパラメーターとして渡す
<div onclick="doubleclick(this, function(){alert('single')}, function(){alert('double')})">click me</div>
<script>
function doubleclick(el, onsingle, ondouble) {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function () {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 300);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
</script>
el.dataset.dblclick
すると、これを行うより良い方法になります。
動作はブラウザに依存していると思います:
同じ要素のクリックイベントとdblclickイベントの両方にハンドラーをバインドすることはお勧めできません。トリガーされるイベントのシーケンスはブラウザーによって異なり、dblclickの前に2つのクリックイベントを受け取るものもあれば、1つだけ受け取るものもあります。ダブルクリックの感度(ダブルクリックとして検出されるクリック間の最大時間)は、オペレーティングシステムとブラウザーによって異なり、多くの場合、ユーザーが構成できます。
http://api.jquery.com/dblclick/
Firefoxでコードを実行すると、click()
ハンドラーのalert()が2回目のクリックを防ぎます。このようなアラートを削除すると、両方のイベントが発生します。
よくダブルクリック(2回クリック)するには、最初に1回クリックする必要があります。click()
アラートがポップアップするので、ハンドラの火災は、あなたの最初のクリックで、そして、あなたが発射する第二のクリック作るチャンスがありませんdblclick()
ハンドラを。
ハンドラーを変更して以外のことを行うalert()
と、動作が表示されます。(おそらく要素の背景色を変更します):
$("#my_id").click(function() {
$(this).css('backgroundColor', 'red')
});
$("#my_id").dblclick(function() {
$(this).css('backgroundColor', 'green')
});
この答えは時代遅れになっています。@ kywの解決策を確認してください。
@AdrienSchulerが投稿した要旨に触発されたソリューションを作成しました。このソリューションは、シングルクリックとダブルクリックを要素にバインドする場合にのみ使用してください。それ以外の場合は、ネイティブclick
およびdblclick
リスナーのます。
これらは違いです:
setTimeout
クリックまたはダブルクリックハンドラーの処理をJavaScript:
function makeDoubleClick(doubleClickCallback, singleClickCallback) {
var clicks = 0, timeout;
return function() {
clicks++;
if (clicks == 1) {
singleClickCallback && singleClickCallback.apply(this, arguments);
timeout = setTimeout(function() { clicks = 0; }, 400);
} else {
timeout && clearTimeout(timeout);
doubleClickCallback && doubleClickCallback.apply(this, arguments);
clicks = 0;
}
};
}
使用法:
var singleClick = function(){ console.log('single click') };
var doubleClick = function(){ console.log('double click') };
element.addEventListener('click', makeDoubleClick(doubleClick, singleClick));
以下はjsfiddleでの使用法です。jQueryボタンは受け入れられた回答の動作です。
A1rPunの回答に基づくもう1つの単純なバニラソリューション(jQueryソリューションについては彼のフィドルを参照してください。どちらもこの1つにあります)。
ユーザーがダブルクリックしたときにシングルクリックハンドラーをトリガーしないように、シングルクリックハンドラーは必ず遅延後にトリガーされます...
var single = function(e){console.log('single')},
double = function(e){console.log('double')};
var makeDoubleClick = function(e) {
var clicks = 0,
timeout;
return function (e) {
clicks++;
if (clicks == 1) {
timeout = setTimeout(function () {
single(e);
clicks = 0;
}, 250);
} else {
clearTimeout(timeout);
double(e);
clicks = 0;
}
};
}
document.getElementById('btnVanilla').addEventListener('click', makeDoubleClick(), false);
以下は、任意の数のイベントに対するjeumのコードの代替案です。
var multiClickHandler = function (handlers, delay) {
var clicks = 0, timeout, delay = delay || 250;
return function (e) {
clicks++;
clearTimeout(timeout);
timeout = setTimeout(function () {
if(handlers[clicks]) handlers[clicks](e);
clicks = 0;
}, delay);
};
}
cy.on('click', 'node', multiClickHandler({
1: function(e){console.log('single clicked ', e.cyTarget.id())},
2: function(e){console.log('double clicked ', e.cyTarget.id())},
3: function(e){console.log('triple clicked ', e.cyTarget.id())},
4: function(e){console.log('quadro clicked ', e.cyTarget.id())},
// ...
}, 300));
これはcytoscape.jsアプリに必要でした。
this
、クリックされた要素であるを割り当てて、ハンドラーに渡すこともできます(それと一緒に、e
またはその代わりに)。
同じ要素のシングルクリックとダブルクリックを区別するにはどうすればよいですか?
あなたがそれらを混在させる必要がない場合は、頼ることができるclick
とdblclick
、それぞれがうまく仕事を行います。
それらをミックスしようとすると、問題が発生:イベントが実際にトリガされますうまくなどのイベントをdblclick
click
使用すると、シングルクリック、ダブルクリックの「スタンドアローン」シングルクリック、または一部であるかどうかを判断する必要があるので、。
さらに、両方click
を使用したりdblclick
、1つの同じ要素で使用したりしないでください。
同じ要素のクリックイベントとdblclickイベントの両方にハンドラーをバインドすることはお勧めできません。トリガーされるイベントのシーケンスはブラウザーによって異なり、dblclickの前に2つのクリックイベントを受け取るものもあれば、1つだけ受け取るものもあります。ダブルクリックの感度(ダブルクリックとして検出されるクリック間の最大時間)は、オペレーティングシステムとブラウザーによって異なり、多くの場合、ユーザーが構成できます。
ソース:https : //api.jquery.com/dblclick/
さて、朗報です。
イベントのdetail
プロパティを使用して、イベントに関連するクリック数を検出できます。これにより、内部をダブルクリックclick
すると、検出がかなり簡単になります。
シングルクリックの検出と、ダブルクリックの一部であるかどうかの問題が残っています。そのために、タイマーとを使用することに戻りますsetTimeout
。
データ属性を使用し(グローバル変数を回避するため)、クリック数を自分でカウントする必要なしに、すべてをまとめて取得します。
<div class="clickit" style="font-size: 200%; margin: 2em; padding: 0.25em; background: orange;">Double click me</div>
<div id="log" style="background: #efefef;"></div>
<script>
var clickTimeoutID;
$( document ).ready(function() {
$( '.clickit' ).click( function( event ) {
if ( event.originalEvent.detail === 1 ) {
$( '#log' ).append( '(Event:) Single click event received.<br>' );
/** Is this a true single click or it it a single click that's part of a double click?
* The only way to find out is to wait it for either a specific amount of time or the `dblclick` event.
**/
clickTimeoutID = window.setTimeout(
function() {
$( '#log' ).append( 'USER BEHAVIOR: Single click detected.<br><br>' );
},
500 // how much time users have to perform the second click in a double click -- see accessibility note below.
);
} else if ( event.originalEvent.detail === 2 ) {
$( '#log' ).append( '(Event:) Double click event received.<br>' );
$( '#log' ).append( 'USER BEHAVIOR: Double click detected.<br>' );
window.clearTimeout( clickTimeoutID ); // it's a dblclick, so cancel the single click behavior.
} // triple, quadruple, etc. clicks are ignored.
});
});
</script>
満足のいく解決策を見つけるのにしばらく時間がかかりました、これが役に立てば幸いです!
優れたjQuery Sparkleプラグインを使用してください。プラグインは、最初と最後のクリックを検出するオプションを提供します。別のクリックの後に最初のクリックが続いたかどうかを検出することにより、クリックとdblclickを区別するために使用できます。
カスタムの「singleclick」イベントを使用して、シングルクリックとダブルクリックを区別できる簡単なjQueryプラグインを作成しました。
https://github.com/omriyariv/jquery-singleclick
$('#someDiv').on('singleclick', function(e) {
// The event will be fired with a small delay.
console.log('This is certainly a single-click');
}
現代の正解は、受け入れられた答えと@kywの解決策を組み合わせたものです。最初のシングルクリックを防ぐためのタイムアウトとevent.detail
、2回目のクリックを防ぐためのチェックが必要です。
const button = document.getElementById('button')
let timer
button.addEventListener('click', event => {
if (event.detail === 1) {
timer = setTimeout(() => {
console.log('click')
}, 200)
}
})
button.addEventListener('dblclick', event => {
clearTimeout(timer)
console.log('dblclick')
})
<button id="button">Click me</button>
私はjquery(および他の90-140k libs)を避けたいと思います、そして言及されたブラウザーが最初にonclickを処理するので、これは私が作成したWebサイトで私がしたことです(この例はクリックされた場所のローカルxyを取得することもカバーします)
clicksNow-0; //global js, owell
function notify2(e, right) { // called from onclick= and oncontextmenu= (rc)
var x,y,xx,yy;
var ele = document.getElementById('wrap');
// offset fixed parent for local win x y
var xxx= ele.offsetLeft;
var yyy= ele.offsetTop;
//NScape
if (document.layers || document.getElementById&&!document.all) {
xx= e.pageX;
yy= e.pageY;
} else {
xx= e.clientX;
yy= e.clientY;
}
x=xx-xxx;
y=yy-yyy;
clicksNow++;
// 200 (2/10ths a sec) is about a low as i seem to be able to go
setTimeout( "processClick( " + right + " , " + x + " , " + y + ")", 200);
}
function processClick(right, x, y) {
if (clicksNow==0) return; // already processed as dblclick
if (clicksNow==2) alert('dbl');
clicksNow=0;
... handle, etc ...
}
それが役に立てば幸い
基づいて、エイドリアンシュラー(ありがとうございました!!!)答え、のためDatatables.netと多くの用途のために、ここでの変更は次のとおりです。
関数
/**
* For handle click and single click in child's objects
* @param {any} selector Parents selector, like 'tr'
* @param {any} single_click_callback Callback for single click
* @param {any} double_click_callback Callback for dblclick
* @param {any} timeout Timeout, optional, 300 by default
*/
jQuery.fn.single_double_click = function (selector, single_click_callback, double_click_callback, timeout) {
return this.each(function () {
let clicks = 0;
jQuery(this).on('click', selector, function (event) {
let self = this;
clicks++;
if (clicks == 1) {
setTimeout(function () {
if (clicks == 1) {
single_click_callback.call(self, event);
} else {
double_click_callback.call(self, event);
}
clicks = 0;
}, timeout || 300);
}
});
});
}
使用する
$("#MyTableId").single_double_click('tr',
function () { // Click
let row = MyTable.row(this);
let id = row.id();
let data = row.data();
console.log("Click in "+id+" "+data);
},
function () { // DBLClick
let row = MyTable.row(this);
let id = row.id();
let data = row.data();
console.log("DBLClick in "+id+" "+data);
}
);
これは私のために働きました–
var clicked=0;
function chkBtnClcked(evnt) {
clicked++;
// wait to see if dblclick
if (clicked===1) {
setTimeout(function() {
clicked=0;
.
.
}, 300); // test for another click within 300ms
}
if (clicked===2) {
stopTimer=setInterval(function() {
clicked=0;
.
.
}, 30*1000); // refresh every 30 seconds
}
}
使用法-
<div id="cloneimages" style="position: fixed;" onclick="chkBtnClcked(evnt)" title="Click for next pic; double-click for slide show"></div>
私はこれが古いことを知っていますが、以下は、シングルクリックとダブルクリックを判別するための単一のタイマーを備えた基本的なループカウンターのJSのみの例です。うまくいけば、これは誰かを助けます。
var count = 0;
var ele = document.getElementById("my_id");
ele.addEventListener('click', handleSingleDoubleClick, false);
function handleSingleDoubleClick()
{
if(!count) setTimeout(TimerFcn, 400); // 400 ms click delay
count += 1;
}
function TimerFcn()
{
if(count > 1) console.log('you double clicked!')
else console.log('you single clicked')
count = 0;
}