【问题标题】:Cancel touchend if touchmove fires如果 touchmove 触发,则取消 touchend
【发布时间】:2013-04-18 19:18:48
【问题描述】:

我正在构建一些主要用于平板电脑的东西,用户可以在屏幕上点击一个项目,然后应用一个类。这是我目前所拥有的:

问题:

  1. 我想使用触摸事件来删除类并在触摸端添加类(以使其更快)。
  2. 如果用户滑动(触摸移动),我不希望它做任何事情。

我尝试了很多方法,但都没有奏效。我尝试过的最简单的(不成功)是这样的:

var dragging = false;

$(".items").on("touchmove", function(){
      dragging = true;
});

$('.items').on("click touchend", function(event){
    if (dragging = true){
    }
    else{
    $('.items').removeClass('selected');
    $(this).addClass('selected');
    }
});

【问题讨论】:

  • if (dragging = true) 应该只是 if (dragging),或者更好的是 if (!dragging) 然后将 else 语句中的所有内容移到 if 语句中(因此,您将没有 else)。
  • 一旦您touchmove 一次,您将设置dragging = true,这将不允许根据您的代码进行任何其他点击。您必须在活动结束后重置dragging = false

标签: javascript jquery click touch-event touchmove


【解决方案1】:

您可以检查事件是否可取消。 touchmove后是假的

$('.items').on("click touchend", function(event){
    if (event.cancelable){
        $('.items').removeClass('selected');
        $(this).addClass('selected');
    }
});

【讨论】:

    【解决方案2】:

    你有拖动检查放的地方

    if (dragging == true){
       dragging = false;
    }
    
    else{
    $('.items').removeClass('selected');
    $(this).addClass('selected');
    }
    

    它会在发布时重置它

    还要注意事件的双重调用,因为它们有时会在某些平台上触发两次最好先检查平台,以下将有助于检查

    var clickEventType=((document.ontouchstart!==null)?'click':'touchend');
    

    var clickEventType = 'touchend';
    if(document.ontouchstart!==null)
    {
         clickEventType = 'click';
    }
    

    【讨论】:

      【解决方案3】:

      我认为这是一种更安全的方法

      设置变量为假

      var dragging = false;
      

      将 var 设置为 true ontouchmove(允许您在应用程序的任何地方重用此代码)

      $("body").on("touchmove", function(){
        dragging = true;
      });
      

      你的按钮

      $("#button").on("touchend", function(){
            if (dragging)
            return;
      
            // your button action code
      });
      

      重置变量(重要)

      $("body").on("touchstart", function(){
          dragging = false;
      });
      

      【讨论】:

        【解决方案4】:

        您想使用以下任一:

        if(dragging == true)
        

        或者,简单地说:

        if(dragging)
        

        设置一个值时应该只使用一个=符号,而检查一个值时应该使用两个==符号。因此,您的代码应如下所示:

        $('.items').on("click touchend", function(event){
            if(!dragging)
            {
                $('.items').removeClass('selected');
                $(this).addClass('selected');
            }
        });
        

        请注意,您不需要检查dragging == true,因为在这种情况下您没有运行任何代码。相反,您可以简单地检查 dragging == false!dragging

        【讨论】:

        • 由于某种原因,它不允许我在触摸设备上添加“选择”类,但它在台式机/笔记本电脑上运行良好。
        • 这里是完整网站的链接:reveriesrefined.com/myftp/Crane 控制台在 chrome 或 firefox 中没有显示任何错误。
        猜你喜欢
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 2014-05-16
        • 2012-06-05
        • 2022-08-15
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多