【问题标题】:recognize long tap without mouseup无需 mouseup 即可识别长按
【发布时间】:2014-08-10 15:31:22
【问题描述】:

我尝试识别长按来启动摇动动画,但我想在按下按钮时启动它,而不是在我得到 mouseup 事件之后。到目前为止,我有以下代码可以执行我不想要的,但这是一个开始..

var offset = 10;
$('body').on('mousedown','.img-select', function (e) {
    $(this).data('start', new Date().getTime());
}).on('mouseup','.img-select', function (e) {
    if (new Date().getTime() >= ($(this).data('start') + offset)) {
        this.blur(); //to avoid a selectbox from opening
        window.focus(); //to avoid a selectbox from opening
        $('.img-item').addClass('shake');
    }
}).on('mouseleave','.img-select', function (e) {
    start = 0;
});

来自@prajmus 建议的想法:

$('body').on('mousedown','.img-select', function (e) {
    //$(this).data('start', new Date().getTime());
    setTimeout(function(){
      $('.img-item').addClass('shake');
    },1000);
}).on('mouseup','.img-select', function (e) {
    /*if (new Date().getTime() >= ($(this).data('start') + offset)) {
        this.blur();
        window.focus();
        $('.img-item').addClass('shake');
    }else{

    }*/
}).on('mouseleave','.img-select', function (e) {
    start = 0;
});

我的 mousedown 事件处理程序中的代码似乎是在我释放按钮时首先启动的?!

由于某种原因,我从@prajmus 推荐的超时内的代码根本没有执行。

在我的想象中,它应该就像你在 ios 中拿着一个应用程序图标..

【问题讨论】:

  • 你可以在mousedown中使用setTimeout,在mouseup中删除这个超时。这样,如果期望的超时时间过去了,就会发生抖动,否则你将删除它的执行。
  • @prajmus 试过这个,但似乎在我离开按钮后超时首先执行..
  • 可能超时值太短? setTimeoutDate.getTime() 使用毫秒,所以你的偏移量 10 太短了
  • @prajmus 我尝试了它,如我的编辑中所示,但它在我再次释放按钮后执行一秒钟..

标签: javascript jquery ios css mobile-safari


【解决方案1】:

您必须将计时器分配给一个变量:

var timeout;
$('body').on('mousedown','.img-select', function (e) {
    timeout = setTimeout(function(){
      $('.img-item').addClass('shake');
    },1000);
}).on('mouseup','.img-select', function (e) {
    clearTimeout(timeout);
}).on('mouseleave','.img-select', function (e) {
    start = 0;
});

查看jsfiddle

【讨论】:

  • 是的,它在 jsfiddle 中工作,但由于某些原因不适用于我,添加了您的代码后,它现在根本不起作用。在我发布它之后不到一秒钟......
  • 您必须按住它 1 秒钟。很难说仅仅这个小代码有什么问题。这个例子本身非常好。
  • 是的,我知道这一点,我将插入一些日志命令以查看发生了什么并返回结果
  • 我的小记录乐趣的结果是超时内的代码甚至没有执行,所以我删除了超时,看看只有我的 addClass 会发生什么,看起来仍然是那个类直到我释放按钮才添加...
  • 由于我在 ipad 上使用此代码不起作用,我不得不使用 touchstarttouchend 而不是 mousedownmouseup。但当然我忘了说我在 ipad 上..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2019-01-25
  • 1970-01-01
  • 2015-03-29
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多