Jquery ผูกดับเบิ้ลคลิกและคลิกเดียวแยกกัน


97

มีบางอย่างใน jquery ที่ช่วยให้ฉันแยกความแตกต่างระหว่างพฤติกรรมในการดับเบิลคลิกและคลิกครั้งเดียวได้หรือไม่

เมื่อฉันเชื่อมโยงทั้งสองเข้ากับองค์ประกอบเดียวกันจะมีการดำเนินการคลิกเพียงครั้งเดียวเท่านั้น

มีวิธีการรอสักครู่ก่อนที่จะดำเนินการคลิกเพียงครั้งเดียวเพื่อดูว่าผู้ใช้คลิกอีกครั้งหรือไม่?

ขอบคุณ :)


คำตอบ:


145

ฉันพบว่าคำตอบของ 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
ใช้. delegate () ทับ. live () แม้ว่า
John Strickler

23
ใช้.on()มากกว่าทั้งสองอย่างตอนนี้
Claudiu

2
การใช้โซลูชันนี้จะทำให้เหตุการณ์การคลิกล่าช้าในระยะ 700 มิลลิวินาที! มันน่ารำคาญมากสำหรับผู้ใช้ ...
uriel

1
@uriel หากคุณคิดว่า 700 ms นานเกินไปที่จะรอการดับเบิลคลิกเพียงแค่ทำให้ตัวเลขเล็กลงจนกว่าจะเหมาะสมกับความต้องการของคุณ
Garland Pope

1
ณ jQuery 1.7: เพื่อรองรับเนื้อหาที่โหลดในภายหลัง (สิ่งที่ ajax) ให้ใช้$("document").on("click","a" function(e){แทนในบรรทัดที่ 5 โครงสร้างนี้จะแทนที่delegate()การใช้งานที่เลิกใช้แล้ว แต่documentคุณสามารถ / ควรใช้ออบเจ็กต์หลักของaDOM ด้านล่างเท่าที่จะเป็นไปได้ซึ่งยังคงมีอยู่ตลอดเวลา
เฟินกรานิช

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 (คลิก == 1) แต่คุณไม่สามารถเพิ่มฟังก์ชันคลิกครั้งเดียวได้ ขอบคุณอีกครั้ง :)
kritya

@kritya ฉันแก้ไขคำตอบของฉัน - สิ่งนี้น่าจะได้ผลดีกว่าสำหรับคุณ ดูซอที่นี่ - jsfiddle.net/VfJU4/1
John Strickler

OOOOh ฉันเข้าใจว่าฉันผิดอะไรฉันไม่ได้ใส่สิ่งนั้น ',' การติดเกม dreamweaver มันไม่ได้เน้นมัน: P wtv ขอบคุณ :)
kritya

9

คุณอาจเขียนการใช้งาน click / dblclick ที่คุณกำหนดเองเพื่อรอให้มีการคลิกเพิ่มเติม ฉันไม่เห็นอะไรเลยในฟังก์ชันหลักของ jQuery ที่จะช่วยให้คุณทำสิ่งนี้ได้

อ้างจาก. dblclick ()ที่เว็บไซต์ jQuery

ไม่สามารถเชื่อมโยงตัวจัดการกับทั้งเหตุการณ์คลิกและ dblclick สำหรับองค์ประกอบเดียวกันได้ ลำดับของเหตุการณ์ที่เรียกใช้จะแตกต่างกันไปในแต่ละเบราว์เซอร์โดยที่บางเหตุการณ์ได้รับเหตุการณ์การคลิกสองครั้งก่อน dblclick และอื่น ๆ เพียงเหตุการณ์เดียว ความไวในการคลิกสองครั้ง (เวลาสูงสุดระหว่างการคลิกที่ตรวจพบว่าเป็นการคลิกสองครั้ง) อาจแตกต่างกันไปตามระบบปฏิบัติการและเบราว์เซอร์และมักจะกำหนดค่าได้โดยผู้ใช้


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

ถ้าคุณเพิ่ม Alert (); แทนที่จะเป็น // รหัสของคุณสำหรับการคลิกเพียงครั้งเดียวมันไม่ทำงานเลย
DmitryBoyko

4

ฉันได้เขียนปลั๊กอิน jQuery ที่อนุญาตให้มอบหมายเหตุการณ์การคลิกและ 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

การใช้งาน:$("body").multipleClicks('#mySelector', function(){ /* do something on click */},function(){/* do something on doubleclick */},300);
เฟินกรานิช

อันนี้ช่วยให้คุณสามารถใช้ทั้งคลิกและดับเบิลคลิกพร้อมกันสำหรับการกระทำที่แตกต่างกัน ขอบคุณ! อันนั้นใช้ได้เหมือนมีเสน่ห์
เฟินกรานิช

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
Bruce Pierson

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

และสุดท้ายเราใช้เป็น

$("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 เพื่อดูการคลิกข้อมูลขึ้นและลงเมื่อคุณคลิกปรับเวลา (1,000) ให้เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.