【问题标题】:jquery $.on() and touch event handling odd behavior when using date()jquery $.on() 和使用 date() 时处理奇怪行为的触摸事件
【发布时间】:2012-09-17 12:17:25
【问题描述】:

为了在移动设备上实现“长按”,我从一个简单的事件映射开始,其中touchstart 设置一个时间,touchend 设置另一个,然后计算差异以了解如何长元素被按下。这是我的旧代码:

        $('html')
            .on({
                touchstart : function(e){
                    g.tt.start = new Date();
                },
                touchend : function(e){
                    g.tt.end = new Date();
                    g.tt.delta = g.tt.end - g.tt.start;
                    alert(g.tt.delta);
                    g.tt = {};
                }
            })
        ;

但不幸的是……

...每隔一次按下都会计算从前一个触摸结束到触摸开始的差异。我很确定我缺少一些基本的东西,因此最终过度设计了这个(我害怕没有正式的培训)。这是我的新代码:

        $('html')
            .on({
                touchstart : function(e){
                    g.tt = {};
                    g.tt.start = new Date();
                },
                touchend : function(e){
                    g.tt.end = new Date();
                    g.tt.delta = g.tt.end - g.tt.start;
                    if( isNaN(g.tt.delta) == false ) {
                        alert(g.tt.delta);
                    } 
                    else {
                        return false;
                    }
                    setTimeout(function(){g.tt = {}; });
                }
            })
        ;

难道不应该有一个更简单的方法来使用更少的子句吗?别介意我有趣的g.tt 变量名。

【问题讨论】:

  • 出于好奇,您不喜欢处理这类事情的jqTouch 吗?
  • 它做了非常具体的事情。我认为它很棒,但它不符合我的需求。

标签: events jquery-mobile mobile-safari jquery


【解决方案1】:

我意识到我采取了错误的方法,并且还找到了一个不错的插件:

http://aanandprasad.com/articles/jquery-tappable/

【讨论】:

    【解决方案2】:

    你是在计时两个事件之间的差异,所以不需要使用setTimeout,只需使用闭包来共享两个事件之间的一些变量。这个例子取自这个answer

    (function () {
      var start, end;
      $('html').on({
        touchstart : function(e){
          start = +new Date(); // get unix-timestamp in milliseconds
        },
        touchend : function(e){
          end = +new Date();
          g.tt.delta = end - start;
          if( isNaN(g.tt.delta) == false ) {
            alert(g.tt.delta);
          }
        }
      });
    })();
    

    这是demo showing this with mouse events and touch events

    【讨论】:

    • 看,但就像我的原始代码一样,您的解决方案也会导致计算第二次抽头。出于某种原因,它只适用于其他触摸。
    • 为什么 new Date() 前面有一个+?
    • 从对链接答案的评论中,“它只是进行类型转换(到数字),有关更多详细信息,请参见以下答案:stackoverflow.com/questions/1983040/…”我发现这种方法相当优雅。我还创建了一个基于触摸的演示并在我的 ipad 上进行了测试,似乎对我有用
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多