ฉันจะฟังการคลิกค้างใน jQuery ได้อย่างไร


116

ฉันต้องการให้สามารถเริ่มเหตุการณ์เมื่อผู้ใช้คลิกที่ปุ่มจากนั้นกดค้างไว้เป็นเวลา 1,000 ถึง 1,500 มิลลิวินาที

มีฟังก์ชันหลักของ jQuery หรือปลั๊กอินที่เปิดใช้งานอยู่แล้วหรือไม่?

ควรม้วนเองหรือไม่? ควรเริ่มจากตรงไหน?


อาจซ้ำซ้อนของLong Press ใน JavaScript?
Der Hochstapler

แล้ว 'taphold' ล่ะ ??
Roshdy

คำตอบ:


173
var timeoutId = 0;

$('#myElement').on('mousedown', function() {
    timeoutId = setTimeout(myFunction, 1000);
}).on('mouseup mouseleave', function() {
    clearTimeout(timeoutId);
});

แก้ไข : แก้ไขต่อ AndyE ... ขอบคุณ!

แก้ไข 2 : ใช้การผูกทันทีสำหรับสองเหตุการณ์ที่มีตัวจัดการเดียวกันต่อ gnarf


4
การอัปเดตจะดีกว่า แต่คุณอาจพิจารณาล้างช่วงเวลาในmouseleaveตัวจัดการด้วย
Andy E

5
คุณสามารถใช้ฟังก์ชันเดียวกันนี้สำหรับ mouseup / mouseleave:.bind('mouseup mouseleave', function() {
gnarf

@gnarf จุดดี! ฉันได้แก้ไขเพื่อรวมคำแนะนำของคุณ
treeface

ของดี! ดำเนินการภายใน jQuery Mobile โดยไม่มีปัญหาใด ๆ
Anthony

@treeface เนียน แต่ฉันสับสนว่า payload จะไปไหน ควรเรียกตัวจัดการเฉพาะการใช้งานในเหตุการณ์ mouseup หรือไม่
Bob Stein

13

Aircoded (แต่ทดสอบกับซอนี้ )

(function($) {
    function startTrigger(e) {
        var $elem = $(this);
        $elem.data('mouseheld_timeout', setTimeout(function() {
            $elem.trigger('mouseheld');
        }, e.data));
    }

    function stopTrigger() {
        var $elem = $(this);
        clearTimeout($elem.data('mouseheld_timeout'));
    }


    var mouseheld = $.event.special.mouseheld = {
        setup: function(data) {
            // the first binding of a mouseheld event on an element will trigger this
            // lets bind our event handlers
            var $this = $(this);
            $this.bind('mousedown', +data || mouseheld.time, startTrigger);
            $this.bind('mouseleave mouseup', stopTrigger);
        },
        teardown: function() {
            var $this = $(this);
            $this.unbind('mousedown', startTrigger);
            $this.unbind('mouseleave mouseup', stopTrigger);
        },
        time: 750 // default to 750ms
    };
})(jQuery);

// usage
$("div").bind('mouseheld', function(e) {
    console.log('Held', e);
})

วิธีเลือกข้อความที่มีสีต่างกันเมื่อเราแตะบนอุปกรณ์ค้างไว้
โชคดี

8

ฉันสร้างปลั๊กอิน JQuery ง่ายๆสำหรับสิ่งนี้หากใครสนใจ

http://plugins.jquery.com/pressAndHold/


ทำได้ดีนี่. สามารถแก้ไขสิ่งนี้เพื่อตรวจจับว่ามีการลากวัตถุเพื่อลบข้อความที่บอกให้ผู้ใช้ลากวัตถุ
Starfs

ปลั๊กอิน FANTASTIC ตกอยู่ในโครงการของฉันและแบมทำงาน
Andy

ปลั๊กอินของคุณไม่ได้เขียนขึ้นสำหรับ Bootstrap แต่ใช้งานได้ดีกับมันมาก! ไม่มี CSS เพิ่มเติมหรือวุ่นวาย ใช้งานได้จริง ความรุ่งโรจน์
Andy

5

สันนิษฐานว่าคุณสามารถเริ่มการsetTimeoutโทรเข้าmousedownและยกเลิกได้ในmouseup(หากmouseupเกิดขึ้นก่อนหมดเวลา)

อย่างไรก็ตามดูเหมือนว่ามีปลั๊กอิน: longclick


1

นี่คือการใช้งานปัจจุบันของฉัน:

$.liveClickHold = function(selector, fn) {

    $(selector).live("mousedown", function(evt) {

        var $this = $(this).data("mousedown", true);

        setTimeout(function() {
            if ($this.data("mousedown") === true) {
                fn(evt);
            }
        }, 500);

    });

    $(selector).live("mouseup", function(evt) {
        $(this).data("mousedown", false);
    });

}

1
    var _timeoutId = 0;

    var _startHoldEvent = function(e) {
      _timeoutId = setInterval(function() {
         myFunction.call(e.target);
      }, 1000);
    };

    var _stopHoldEvent = function() {
      clearInterval(_timeoutId );
    };

    $('#myElement').on('mousedown', _startHoldEvent).on('mouseup mouseleave', _stopHoldEvent);

0

ฉันเขียนโค้ดบางอย่างเพื่อให้ง่าย

//Add custom event listener
$(':root').on('mousedown', '*', function() {
    var el = $(this),
        events = $._data(this, 'events');
    if (events && events.clickHold) {
        el.data(
            'clickHoldTimer',
            setTimeout(
                function() {
                    el.trigger('clickHold')
                },
                el.data('clickHoldTimeout')
            )
        );
    }
}).on('mouseup mouseleave mousemove', '*', function() {
    clearTimeout($(this).data('clickHoldTimer'));
});

//Attach it to the element
$('#HoldListener').data('clickHoldTimeout', 2000); //Time to hold
$('#HoldListener').on('clickHold', function() {
    console.log('Worked!');
});
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<img src="http://lorempixel.com/400/200/" id="HoldListener">

ดูใน JSFiddle

ตอนนี้คุณต้องกำหนดเวลาในการถือครองและเพิ่มclickHoldเหตุการณ์ในองค์ประกอบของคุณ


0

ลองสิ่งนี้:

var thumbnailHold;

    $(".image_thumb").mousedown(function() {
        thumbnailHold = setTimeout(function(){
             checkboxOn(); // Your action Here

         } , 1000);
     return false;
});

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