Jquery 바인딩 더블클릭과 싱글클릭 별도
더블클릭 동작과 싱글클릭 동작을 구분할 수 있는 jquery가 있습니까?
둘 다 같은 요소에 바인딩하면 클릭 한 번만 실행됩니다.
클릭 한 번을 실행하기 전에 사용자가 다시 클릭하는지 여부를 확인할 수 있는 방법이 있습니까?
감사합니다 :)
저는 존 스트리클러의 대답이 제가 기대했던 것과 완전히 일치하지 않는다는 것을 발견했습니다.경고가 2초 창에서 두 번째 클릭으로 트리거되면 이후 클릭할 때마다 다시 클릭하기 전에 2초를 기다릴 때까지 다른 경고가 트리거됩니다.존의 코드에서는 트리플 클릭이 더블 클릭으로 작동합니다. 더블 클릭 후에 한 번 클릭하는 것처럼 작동합니다.
저는 이런 식으로 작동하고 제 마음이 더 잘 이해할 수 있는 방향으로 흐르기 위해 그의 해결책을 수정했습니다.저는 제가 보통의 감도라고 느끼는 것을 더 잘 시뮬레이션하기 위해 지연 시간을 2000년에서 700년으로 낮췄습니다.여기 바이올린이 있습니다: http://jsfiddle.net/KpCwN/4/ .
재단에 감사드립니다, 존.저는 이 대체 버전이 다른 사람들에게 유용하기를 바랍니다.
var DELAY = 700, clicks = 0, timer = null;
$(function(){
$("a").on("click", function(e){
clicks++; //count clicks
if(clicks === 1) {
timer = setTimeout(function() {
alert("Single Click"); //perform single-click action
clicks = 0; //after action performed, reset counter
}, DELAY);
} else {
clearTimeout(timer); //prevent single-click action
alert("Double Click"); //perform double-click action
clicks = 0; //after action performed, reset counter
}
})
.on("dblclick", function(e){
e.preventDefault(); //cancel system double-click event
});
});
"응답 없음"에서 제공된 솔루션은 두 이벤트를 모두 실행하고, 두 번 클릭하면 클릭하고 dblclick합니다.하지만 저는 그것이 올바른 방향을 가리킨다고 생각합니다.
약간의 변경을 가했습니다. 결과는 다음과 같습니다.
$("#clickMe").click(function (e) {
var $this = $(this);
if ($this.hasClass('clicked')){
$this.removeClass('clicked');
alert("Double click");
//here is your code for double click
}else{
$this.addClass('clicked');
setTimeout(function() {
if ($this.hasClass('clicked')){
$this.removeClass('clicked');
alert("Just one click!");
//your code for single click
}
}, 500);
}
});
먹어봐.
http://jsfiddle.net/calterras/xmmo3esg/
예, 두 핸들러를 바인딩합니다. 한 핸들러는click
그리고 다른 하나는dblclick
클릭할 때마다 증가하는 변수를 만듭니다.설정된 지연 후 재설정됩니다.setTimeout 함수 안에서 당신은 무언가를 할 수 있습니다...
var DELAY = 2000,
clicks = 0,
timer = null;
$('a').bind({
click: function(e) {
clearTimeout(timer);
timer = setTimeout(function() {
clicks = 0;
}, DELAY);
if(clicks === 1) {
alert(clicks);
//do something here
clicks = 0;
}
//Increment clicks
clicks++;
},
dblclick: function(e) {
e.preventDefault(); //don't do anything
}
});
click/dblclick의 사용자 정의 구현을 작성하여 추가 클릭을 기다릴 수 있습니다.핵심 jQuery 함수에는 이를 달성하는 데 도움이 될 만한 내용이 없습니다.
jQuery 사이트의 .dblclick()에서 인용합니다.
동일한 요소에 대해 click 이벤트와 dblick 이벤트 모두에 핸들러를 바인딩하는 것은 권장되지 않습니다.트리거된 이벤트 시퀀스는 브라우저마다 다르며, 일부는 dblclick 이전에 두 번의 클릭 이벤트를 수신하고 다른 일부는 한 번만 수신합니다.두 번 클릭 감도(두 번 클릭으로 감지되는 클릭 간의 최대 시간)는 운영 체제와 브라우저에 따라 다를 수 있으며 종종 사용자가 구성할 수 있습니다.
다음 코드를 보십시오.
$("#clickMe").click(function (e) {
var $this = $(this);
if ($this.hasClass('clicked')){
alert("Double click");
//here is your code for double click
return;
}else{
$this.addClass('clicked');
//your code for single click
setTimeout(function() {
$this.removeClass('clicked'); },500);
}//end of else
});
데모는 http://jsfiddle.net/cB484/ 에서 확인할 수 있습니다.
클릭 및 dblclick 이벤트를 위임할 수 있는 jQuery 플러그인을 작성했습니다.
// jQuery plugin to bind both single and double click to objects
// parameter 'delegateSelector' is optional and allow to delegate the events
// parameter 'dblclickWait' is optional default is 300
(function($) {
$.fn.multipleClicks = function(delegateSelector, clickFun, dblclickFun, dblclickWait) {
var obj;
if (typeof(delegateSelector)==='function' && typeof(clickFun)==='function') {
dblclickWait = dblclickFun; dblclickFun = clickFun; clickFun = delegateSelector; delegateSelector = null; // If 'delegateSelector' is missing reorder arguments
} else if (!(typeof(delegateSelector)==='string' && typeof(clickFun)==='function' && typeof(dblclickFun)==='function')) {
return false;
}
return $(this).each(function() {
$(this).on('click', delegateSelector, function(event) {
var self = this;
clicks = ($(self).data('clicks') || 0)+1;
$(self).data('clicks', clicks);
if (clicks == 1) {
setTimeout(function(){
if ($(self).data('clicks') == 1) {
clickFun.call(self, event); // Single click action
} else {
dblclickFun.call(self, event); // Double click action
}
$(self).data('clicks', 0);
}, dblclickWait || 300);
}
});
});
};
})(jQuery);
이 솔루션은 저에게 적합합니다.
var DELAY = 250, clicks = 0, timer = null;
$(".fc-event").click(function(e) {
if (timer == null) {
timer = setTimeout(function() {
clicks = 0;
timer = null;
// single click code
}, DELAY);
}
if(clicks === 1) {
clearTimeout(timer);
timer = null;
clicks = -1;
// double click code
}
clicks++;
});
저는 이 간단한 솔루션인 http://jsfiddle.net/533135/VHkLR/5/ 을 구현하고 있습니다.
<p>Click on this paragraph.</p>
<b> </b>
스크립트 코드
var dbclick=false;
$("p").click(function(){
setTimeout(function(){
if(dbclick ==false){
$("b").html("clicked")
}
},200)
}).dblclick(function(){
dbclick = true
$("b").html("dbclicked")
setTimeout(function(){
dbclick = false
},300)
});
그것은 그다지 느리지 않습니다.
var singleClickTimer = 0; //define a var to hold timer event in parent scope
jqueryElem.click(function(e){ //using jquery click handler
if (e.detail == 1) { //ensure this is the first click
singleClickTimer = setTimeout(function(){ //create a timer
alert('single'); //run your single click code
},250); //250 or 1/4th second is about right
}
});
jqueryElem.dblclick(function(e){ //using jquery dblclick handler
clearTimeout(singleClickTimer); //cancel the single click
alert('double'); //run your double click code
});
위의 답변을 몇 가지 변경했는데 여전히 잘 작동합니다. http://jsfiddle.net/arondraper/R8cDR/
아래는 이 문제에 대한 저의 간단한 접근법입니다.
JQuery 함수:
jQuery.fn.trackClicks = function () {
if ($(this).attr("data-clicks") === undefined) $(this).attr("data-clicks", 0);
var timer;
$(this).click(function () {
$(this).attr("data-clicks", parseInt($(this).attr("data-clicks")) + 1);
if (timer) clearTimeout(timer);
var item = $(this);
timer = setTimeout(function() {
item.attr("data-clicks", 0);
}, 1000);
});
}
구현:
$(function () {
$("a").trackClicks();
$("a").click(function () {
if ($(this).attr("data-clicks") === "2") {
// Double clicked
}
});
});
Firefox/Chrome에서 클릭한 요소를 검사하여 클릭할 때 데이터 클릭이 위/아래로 이동하는지 확인하고 시간(1000)을 적절하게 조정합니다.
(function($){
$.click2 = function (elm, o){
this.ao = o;
var DELAY = 700, clicks = 0;
var timer = null;
var self = this;
$(elm).on('click', function(e){
clicks++;
if(clicks === 1){
timer = setTimeout(function(){
self.ao.click(e);
}, DELAY);
} else {
clearTimeout(timer);
self.ao.dblclick(e);
}
}).on('dblclick', function(e){
e.preventDefault();
});
};
$.click2.defaults = { click: function(e){}, dblclick: function(e){} };
$.fn.click2 = function(o){
o = $.extend({},$.click2.defaults, o);
this.each(function(){ new $.click2(this, o); });
return this;
};
})(jQuery);
그리고 마지막으로 우리는 로 사용합니다.
$("a").click2({
click : function(e){
var cid = $(this).data('cid');
console.log("Click : "+cid);
},
dblclick : function(e){
var cid = $(this).data('cid');
console.log("Double Click : "+cid);
}
});
위의 답변과 동일하지만 트리플 클릭이 가능합니다. (지연 500) http://jsfiddle.net/luenwarneke/rV78Y/1/
var DELAY = 500,
clicks = 0,
timer = null;
$(document).ready(function() {
$("a")
.on("click", function(e){
clicks++; //count clicks
timer = setTimeout(function() {
if(clicks === 1) {
alert('Single Click'); //perform single-click action
} else if(clicks === 2) {
alert('Double Click'); //perform single-click action
} else if(clicks >= 3) {
alert('Triple Click'); //perform Triple-click action
}
clearTimeout(timer);
clicks = 0; //after action performed, reset counter
}, DELAY);
})
.on("dblclick", function(e){
e.preventDefault(); //cancel system double-click event
});
});
이것은 기본 자바스크립트를 사용하여 수행할 수 있는 방법으로, 저에게 적합합니다.
var v_Result;
function OneClick() {
v_Result = false;
window.setTimeout(OneClick_Nei, 500)
function OneClick_Nei() {
if (v_Result != false) return;
alert("single click");
}
}
function TwoClick() {
v_Result = true;
alert("double click");
}
상태를 관리하기 위해 별도의 변수를 생성하지 않으려면 이 답변을 확인하십시오. https://stackoverflow.com/a/65620562/4437468
언급URL : https://stackoverflow.com/questions/6330431/jquery-bind-double-click-and-single-click-separately
'programing' 카테고리의 다른 글
Oracle SQL Developer에서 BLOB(JSON 포함)를 편집하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
---|---|
전체 포스트백 없이 AJAX 업데이트 패널에서 파일 업로드 (0) | 2023.09.08 |
지정된 열의 백분위수 통계 찾기 (0) | 2023.09.03 |
파워셸 마우스를 움직여도 유휴 모드가 방지되지 않습니다. (0) | 2023.09.03 |
시간을 변환합니다.문자열 작성 시간 (0) | 2023.09.03 |