Jquery связать двойной клик и один клик отдельно - PullRequest
90 голосов
/ 13 июня 2011

Есть ли в jquery что-то, что позволило бы мне различать поведение при двойном щелчке и одиночном щелчке?

Когда я связываю оба элемента с одним и тем же элементом, выполняется только один щелчок.

Есть ли способ, который ждет некоторое время перед выполнением одного клика, чтобы увидеть, нажимает ли пользователь снова или нет?

Спасибо :))

Ответы [ 14 ]

138 голосов
/ 21 октября 2011

Я обнаружил, что ответ Джона Стриклера не совсем оправдал мои ожидания. Как только предупреждение вызывается вторым щелчком в пределах двухсекундного окна, каждый последующий щелчок вызывает другое предупреждение, пока вы не подождите две секунды, прежде чем щелкнуть снова. Таким образом, в коде Джона тройной щелчок действует как два двойных щелчка, и я ожидаю, что он будет действовать как двойной щелчок, за которым следует один щелчок.

Я переработал его решение, чтобы функционировать таким образом и действовать так, чтобы мой разум мог лучше понять. Я уменьшил задержку с 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
    });

});
14 голосов
/ 10 октября 2014

Решение, данное из "Nott Responding", похоже, запускает оба события, щелчок и 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/

10 голосов
/ 13 июня 2011

Конечно, свяжите два обработчика, один с 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
    }
});
9 голосов
/ 13 июня 2011

Вы могли бы написать свою собственную реализацию click / dblclick, чтобы она ждала дополнительного клика.В основных функциях jQuery я не вижу ничего, что помогло бы вам достичь этого.

Цитата .dblclick () на сайте jQuery

Itнежелательно привязывать обработчики к событиям click и dblclick для одного и того же элемента.Последовательность запускаемых событий варьируется от браузера к браузеру: одни получают два события щелчка до dblclick, а другие - только одно.Чувствительность к двойному щелчку (максимальное время между щелчками, определяемое как двойной щелчок) может варьироваться в зависимости от операционной системы и браузера и часто настраивается пользователем.

4 голосов
/ 27 сентября 2014

Я написал плагин jQuery, который позволяет также делегировать события click и dblclick

// 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);
4 голосов
/ 23 апреля 2014

Посмотрите на следующий код

$("#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/

3 голосов
/ 28 ноября 2012

я реализую это простое решение, http://jsfiddle.net/533135/VHkLR/5/
HTML-код

<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)
});


не сильно отстает

2 голосов
/ 06 февраля 2012

Это решение работает для меня

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++;
});
1 голос
/ 06 ноября 2011
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
});
0 голосов
/ 09 октября 2015

Ниже приведен мой простой подход к проблеме.

Функция 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) в соответствии с требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...