Long pressJavaScript的$("a").mouseup(function(){ // Clear timeout return false;}).mousedown(func" />

长期在JavaScript?

javascript jquery jquery-ui jquery-mobile javascript-events

132273 观看

18回复

是否可以在JavaScript(或jQuery)中实现“长按”?怎么样?

alt text http://androinica.com/wp-content/uploads/2009/11/longpress_options.png

HTML

<a href="" title="">Long press</a>

JavaScript的

$("a").mouseup(function(){
  // Clear timeout
  return false;
}).mousedown(function(){
  // Set timeout
  return false; 
});
作者: Randy Mayer 的来源 发布者: 2019 年 6 月 26 日

回应 (18)


155

决定

没有'jQuery'魔法,只有JavaScript定时器。

var pressTimer;

$("a").mouseup(function(){
  clearTimeout(pressTimer);
  // Clear timeout
  return false;
}).mousedown(function(){
  // Set timeout
  pressTimer = window.setTimeout(function() { ... Your Code ...},1000);
  return false; 
});
作者: Diodeus - James MacFarlane 发布者: 12.04.2010 08:33

28

根据Maycow Moura的回答,我写了这个。它还确保用户不会进行右键单击,这会触发长按并在移动设备上运行。DEMO

var node = document.getElementsByTagName("p")[0];
var longpress = false;
var presstimer = null;
var longtarget = null;

var cancel = function(e) {
    if (presstimer !== null) {
        clearTimeout(presstimer);
        presstimer = null;
    }

    this.classList.remove("longpress");
};

var click = function(e) {
    if (presstimer !== null) {
        clearTimeout(presstimer);
        presstimer = null;
    }

    this.classList.remove("longpress");

    if (longpress) {
        return false;
    }

    alert("press");
};

var start = function(e) {
    console.log(e);

    if (e.type === "click" && e.button !== 0) {
        return;
    }

    longpress = false;

    this.classList.add("longpress");

    if (presstimer === null) {
        presstimer = setTimeout(function() {
            alert("long click");
            longpress = true;
        }, 1000);
    }

    return false;
};

node.addEventListener("mousedown", start);
node.addEventListener("touchstart", start);
node.addEventListener("click", click);
node.addEventListener("mouseout", cancel);
node.addEventListener("touchend", cancel);
node.addEventListener("touchleave", cancel);
node.addEventListener("touchcancel", cancel);

您还应该使用CSS动画包含一些指标:

p {
    background: red;
    padding: 100px;
}

.longpress {
    -webkit-animation: 1s longpress;
            animation: 1s longpress;
}

@-webkit-keyframes longpress {
    0%, 20% { background: red; }
    100% { background: yellow; }
}

@keyframes longpress {
    0%, 20% { background: red; }
    100% { background: yellow; }
}
作者: kelunik 发布者: 11.12.2014 01:29

25

您可以使用jQuery mobile API的taphold事件。

jQuery("a").on("taphold", function( event ) { ... } )
作者: doganak 发布者: 13.09.2011 08:33

15

虽然它看起来很简单,可以通过超时和几个鼠标事件处理程序自行实现,但是当您考虑点击 - 拖动 - 释放等情况时,它会变得有点复杂,同时支持按下和长按相同的元素,以及使用iPad等触控设备。我最终使用了longclick jQuery插件Github),它为我处理这些东西。如果您只需要支持移动电话等触摸屏设备,您也可以尝试jQuery Mobile taphold活动

作者: ʇsәɹoɈ 发布者: 24.02.2011 06:57

10

jQuery插件。刚刚放$(expression).longClick(function() { <your code here> });。第二个参数是保持时间; 默认超时为500毫秒。

(function($) {
    $.fn.longClick = function(callback, timeout) {
        var timer;
        timeout = timeout || 500;
        $(this).mousedown(function() {
            timer = setTimeout(function() { callback(); }, timeout);
            return false;
        });
        $(document).mouseup(function() {
            clearTimeout(timer);
            return false;
        });
    };

})(jQuery);
作者: piwko28 发布者: 01.10.2012 09:28

8

我创建了长按事件 (0.5k纯JavaScript)来解决这个问题,它long-press向DOM 添加了一个事件。

侦听long-press的任何元素:

// the event bubbles, so you can listen at the root level
document.addEventListener('long-press', function(e) {
  console.log(e.target);
});

侦听long-press一个在特定的元素:

// get the element
var el = document.getElementById('idOfElement');

// add a long-press event listener
el.addEventListener('long-press', function(e) {

    // stop the event from bubbling up
    e.preventDefault()

    console.log(e.target);
});

适用于IE9 +,Chrome,Firefox,Safari和混合移动应用程序(iOS / Android上的Cordova和Ionic)

演示

作者: John Doherty 发布者: 09.06.2017 02:08

5

$(document).ready(function () {
    var longpress = false;

    $("button").on('click', function () {
        (longpress) ? alert("Long Press") : alert("Short Press");
    });

    var startTime, endTime;
    $("button").on('mousedown', function () {
        startTime = new Date().getTime();
    });

    $("button").on('mouseup', function () {
        endTime = new Date().getTime();
        longpress = (endTime - startTime < 500) ? false : true;
    });
});

DEMO

作者: razzak 发布者: 25.03.2013 08:12

5

对于跨平台开发人员(注意到目前为止给出的所有答案都不适用于iOS)

Mouseup / down似乎在android上运行正常- 但不是所有设备即(三星tab4)。在iOS上根本没用

进一步研究它似乎是由于元素具有选择和原生放大率中断听众。

如果用户将图像保持500ms,则此事件侦听器可以在引导模式中打开缩略图图像。

它使用响应式图像类,因此显示更大版本的图像。这段代码已经过全面测试(iPad / Tab4 / TabA / Galaxy4):

var pressTimer;  
$(".thumbnail").on('touchend', function (e) {
   clearTimeout(pressTimer);
}).on('touchstart', function (e) {
   var target = $(e.currentTarget);
   var imagePath = target.find('img').attr('src');
   var title = target.find('.myCaption:visible').first().text();
   $('#dds-modal-title').text(title);
   $('#dds-modal-img').attr('src', imagePath);
   // Set timeout
   pressTimer = window.setTimeout(function () {
      $('#dds-modal').modal('show');
   }, 500)
});
作者: tyler_mitchell 发布者: 23.10.2015 01:16

4

Diodeus的答案很棒,但它阻止你添加一个onClick函数,如果你放一个onclick它就永远不会运行hold函数。Razzak的答案几乎是完美的,但它只在mouseup上运行hold函数,一般来说,即使用户继续保持,该函数也会运行。

所以,我加入了两个,并做了这个:

$(element).on('click', function () {
    if(longpress) { // if detect hold, stop onclick function
        return false;
    };
});

$(element).on('mousedown', function () {
    longpress = false; //longpress is false initially
    pressTimer = window.setTimeout(function(){
    // your code here

    longpress = true; //if run hold function, longpress is true
    },1000)
});

$(element).on('mouseup', function () {
    clearTimeout(pressTimer); //clear time on mouseup
});
作者: Maycow Moura 发布者: 20.04.2014 02:54

2

您可以在鼠标按下时设置该元素的超时并在鼠标向上清除它:

$("a").mousedown(function() {
    // set timeout for this element
    var timeout = window.setTimeout(function() { /* … */ }, 1234);
    $(this).mouseup(function() {
        // clear timeout for this element
        window.clearTimeout(timeout);
        // reset mouse up event handler
        $(this).unbind("mouseup");
        return false;
    });
    return false;
});

有了这个,每个元素都有自己的超时。

作者: Gumbo 发布者: 12.04.2010 08:39

2

对于现代移动浏览器:

document.addEventListener('contextmenu', callback);

https://developer.mozilla.org/en-US/docs/Web/Events/contextmenu

作者: Kory Nunn 发布者: 12.05.2015 02:31

1

你可以使用jquery-mobile的taphold。包括jquery-mobile.js,以下代码将正常工作

$(document).on("pagecreate","#pagename",function(){
  $("p").on("taphold",function(){
   $(this).hide(); //your code
  });    
});
作者: Prashant_M 发布者: 21.04.2015 10:32

1

最优雅和干净的是一个jQuery插件:https//github.com/untill/jquery.longclick/,也可以打包:https://www.npmjs.com/package/jquery.longclick 。

简而言之,您可以像这样使用它:

$( 'button').mayTriggerLongClicks().on( 'longClick', function() { your code here } );

这个插件的优点是,与此处的其他一些答案相比,单击事件仍然是可能的。另请注意,在鼠标放置之前,就像在设备上长按一样,会发生长时间点击。所以,这是一个功能。

作者: untill 发布者: 02.06.2015 11:30

0

对我来说,它可以使用该代码(使用jQuery):

var int       = null,
    fired     = false;

var longclickFilm = function($t) {
        $body.css('background', 'red');
    },
    clickFilm = function($t) {
        $t  = $t.clone(false, false);
        var $to = $('footer > div:first');
        $to.find('.empty').remove();
        $t.appendTo($to);
    },
    touchStartFilm = function(event) {
        event.preventDefault();
        fired     = false;
        int       = setTimeout(function($t) {
            longclickFilm($t);
            fired = true;
        }, 2000, $(this)); // 2 sec for long click ?
        return false;
    },
    touchEndFilm = function(event) {
        event.preventDefault();
        clearTimeout(int);
        if (fired) return false;
        else  clickFilm($(this));
        return false;
    };

$('ul#thelist .thumbBox')
    .live('mousedown touchstart', touchStartFilm)
    .live('mouseup touchend touchcancel', touchEndFilm);
作者: molokoloco 发布者: 24.05.2012 09:14

0

您可以检查识别点击或长按的时间[jQuery]

function AddButtonEventListener() {
try {
    var mousedowntime;
    var presstime;
    $("button[id$='" + buttonID + "']").mousedown(function() {
        var d = new Date();
        mousedowntime = d.getTime();
    });
    $("button[id$='" + buttonID + "']").mouseup(function() {
        var d = new Date();
        presstime = d.getTime() - mousedowntime;
        if (presstime > 999/*You can decide the time*/) {
            //Do_Action_Long_Press_Event();
        }
        else {
            //Do_Action_Click_Event();
        }
    });
}
catch (err) {
    alert(err.message);
}
} 
作者: Derin 发布者: 12.07.2012 02:25

0

像这样?

doc.addEeventListener("touchstart", function(){
    // your code ...
}, false);    
作者: 翁沈顺 发布者: 17.10.2016 04:04

0

您可以使用jqueryTouch事件。(见这里

  let holdBtn = $('#holdBtn')
  let holdDuration = 1000
  let holdTimer

  holdBtn.on('touchend', function () {
    // finish hold
  });
  holdBtn.on('touchstart', function () {
    // start hold
    holdTimer = setTimeout(function() {
      //action after certain time of hold
    }, holdDuration );
  });
作者: Irteza Asad 发布者: 11.10.2018 06:56

0

我需要一些长按键盘事件,所以我写了这个。

var longpressKeys = [13];
var longpressTimeout = '1500';
var longpressActive = false;
var longpressFunc = null;

document.addEventListener('keydown', function(e) {
    if (longpressFunc == null && longpressKeys.indexOf(e.keyCode) > -1) {
        longpressFunc = setTimeout(function() {
            console.log('longpress triggered');
            longpressActive = true;
        }, longpressTimeout);

    // any key not defined as a longpress
    } else if (longpressKeys.indexOf(e.keyCode) == -1) {
        console.log('shortpress triggered');
    }
});

document.addEventListener('keyup', function(e) {
    clearTimeout(longpressFunc);
    longpressFunc = null;

    // longpress key triggered as a shortpress
    if (!longpressActive && longpressKeys.indexOf(e.keyCode) > -1) {
        console.log('shortpress triggered');
    }
    longpressActive = false;
});
作者: Brad.Smith 发布者: 26.06.2019 01:32
32x32