jQuery分别绑定双击和单击


Answers:


143

我发现约翰·斯特里克勒(John Strickler)的回答并没有达到我的期望。一旦警报在两秒钟窗口中被第二次单击触发,则随后的每次单击都会触发另一个警报,直到您等待两秒钟再单击一次。因此,使用John的代码,三次单击相当于两次双击,我希望它像双击然后单击一样。

我对他的解决方案进行了重新设计,使其以这种方式发挥作用,并以一种我更能理解的方式流动。我将延迟从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
    });

});

1
虽然在.live()上使用.delegate()。
John Strickler

23
.on()现在都使用它们了
Claudiu 2012年

2
使用此解决方案可将点击事件延迟700ms!这对用户来说非常烦人……
uriel 2015年

1
@uriel,如果您认为700毫秒太长,无法等待双击,请减小该数字,直到它适合您的偏好为止。
加兰·教皇

1
从jQuery 1.7开始:为了支持以后加载的内容(ajax内容),请$("document").on("click","a" function(e){在第5行中delegate()使用。此构造替换了不赞成使用的用法。取而代之的是,document您可以/应该尽可能使用aDOM下端的任何父对象,这些对象会持续很短的时间。
Hafenkranich '16

15

从“ 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

当然,请绑定两个处理程序,一个绑定到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
    }
});

非常感谢。我尝试添加if(clicks == 1),但您不能添加单击功能。再次感谢:)
kritya 2011年

@kritya我编辑了答案-这应该对您来说更好。在此处查看小提琴-jsfiddle.net/VfJU4/1
John Strickler

哦,我到了我错了的地方,我没把它写成','沉迷于Dreamweaver,它没有突出显示它:P wtv谢谢:)
kritya 2011年

9

您可以编写自己的click / dblclick自定义实现,以使其等待额外的点击。我在核心jQuery函数中看不到任何可以帮助您实现此目标的东西。

在jQuery网站上引用.dblclick()

建议不要将处理程序绑定到同一元素的click和dblclick事件。触发事件的顺序因浏览器而异,其中一些事件在dblclick之前收到两个click事件,其他事件仅收到一个。双击灵敏度(检测为两次单击之间的最长间隔时间)可能因操作系统和浏览器而异,并且通常可由用户配置。


4

看下面的代码

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


4
我喜欢您添加类并将其用作计数的想法。
nikhil 2014年

如果添加Alert(); 而不是//您的单击代码根本不起作用
开发人员

4

我已经编写了一个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);

这个插件很棒!但是,它似乎在IE9中似乎不起作用?我不在乎较旧的版本(如今的IMO,您现在不应再使用了),但我尝试至少在IE9上实现功能-这是任何人都可以拥有的浏览器(无操作系统限制),并且具有良好的JS支持。
Dennis98 2015年

用法:$("body").multipleClicks('#mySelector', function(){ /* do something on click */},function(){/* do something on doubleclick */},300);
Hafenkranich '16

实际上,这一功能使您可以同时使用 click和doubleclick来执行不同的操作。谢谢!那个像魅力。
Hafenkranich '16

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

简单有效。+1
布鲁斯·皮尔森

3

我正在实现这个简单的解决方案,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

这个解决方案对我有用

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


0
(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);

最后我们使用as。

$("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);
    }
});

$ .click和$ .fn.click有什么区别?
FrenkyB

0

与上述答案相同,但允许三次单击。(延迟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
    });
});

0

您可以使用基本的JavaScript来执行此方法,该方法对我有用:

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

0

下面是我解决该问题的简单方法。

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中的clicked元素,以查看单击时数据单击的次数上下波动,并调整时间(1000)以适合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.