【问题标题】:Find if device is touch screen then apply touch event instead of click event查找设备是否为触摸屏,然后应用触摸事件而不是点击事件
【发布时间】:2015-04-20 11:46:06
【问题描述】:

我正在创建一个 phonegap 应用程序,但据我所知,触发 click 事件而不是 touchevent 需要 300 毫秒。

我不想同时应用这两个事件。有没有办法知道它是否是没有现代化设备的触摸设备。

这里是假设的 jquery 代码

$('#id').on('click',funciton(e){
  alert('id was clicked');
});

有没有办法用纯 JS/jQuery 来做,因为 phonegap 应用程序已经占用了更多的内存,我想尽可能地使用更少的库。

【问题讨论】:

    标签: javascript jquery cordova


    【解决方案1】:

    我的意思是你真的应该Modernizr 但是......

    var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
    var eventType = supportsTouch ? 'ontouchstart' : 'click';
    

    然后声明你的事件监听器:

    $('#id').on(eventType, function(e) {
      alert('id was clicked');
    });
    

    【讨论】:

    • 我认为它会附加,但你能告诉我跨浏览器的兼容性有多大。
    • 请务必更改上述函数的拼写。我尝试对这篇文章进行编辑,但它不会让我编辑,因为它不够大!
    【解决方案2】:

    这应该消除 300 毫秒的延迟并触发桌面和触摸设备上的模拟点击:

    $('#id').on('mousedown touchstart', function() {
    
        $(this).one('mouseup touchend', function() {
            alert('id was clicked');
       });
    });
    

    如果项目中有链接(通常由click 触发),则需要进行一些调整:

    $('#id a').on('mousedown touchstart', function() {
    
        var destination = this.attr('href');
    
        $(this).one('mouseup touchend', function() {
            if (destination) window.location = destination;
        });
    });
    

    编辑 - 已经有一个接受的答案,这个回复更像是一个附加说明。但是 nirmal 在 cmets 中是正确的,即模拟鼠标事件的触摸设备可能会导致并发症。因此,上面的代码更适合仅用于触摸事件。

    为了更完整地回答这个问题,我将发布我同时处理触摸和鼠标事件的方法。然后,任一序列都会触发一个名为 page:tap 的自定义事件。然后可以按如下方式监听这些模拟点击:

    $(subject).on('page:tap', function() { ... });
    

    鼠标和触摸事件是分开的,通过在touchendclick 之间向body 添加一个类来防止任何触发附加事件的模拟,当后者发生时再次删除它。

    var root = $('body'), subject = '#example_1, #example_2';
    
    $(document).on('mousedown touchstart', subject, function(e) {
    
      if (e.type == 'mousedown' && e.which != 1) return; // only respond to left clicks
      var mean = $(e.currentTarget);
    
      mean.one('mouseup touchend', function(e) {
        if (e.type == 'touchend' && !root.hasClass('punch')) root.addClass('punch');
        else if (root.hasClass('punch')) return;
        mean.trigger('page:tap');
      });
    })
    .on('click', subject, function() {
    
      root.removeClass('punch');
      return false;
    });
    

    也可以选择将类添加到活动元素本身或html,这在一定程度上取决于整体设置。

    【讨论】:

    • 它将应用 2 个事件,不是吗。
    • 感谢它对我扩展知识的帮助很大,非常感谢您的回答。
    • 很高兴我可以提供一些额外的信息(因为已经有一个接受的答案)。 :-)
    • Answer 得到了更新,您之前是正确的,因为触摸设备会模拟鼠标事件。这种方法应该是非常安全的。
    【解决方案3】:

    fastclick 应用于您的应用程序。你会在那里找到一个 .js 文件和一个文档。最短的(jQuery)实现方式是:

    $(function() {
        FastClick.attach(document.body);
    });
    

    如果你不使用jQuery,你可以选择其他方式:

    if ('addEventListener' in document) {
        document.addEventListener('DOMContentLoaded', function() {
            FastClick.attach(document.body);
        }, false);
    }
    

    如果您需要进一步的帮助,请告诉我!

    这是direct link to the fastclick.js file

    【讨论】:

    • 有没有办法用纯 JS/jQuery 来做,因为由于内存消耗问题,我不想尽可能多地使用库。
    • @Sithys Asker 已经说过他不想加载任何库。 '反正有没有用纯 JS/jQuery 来做,因为 phonegap 应用程序已经占用了更多内存,我想尽可能少地使用库。'
    • 就像您看到的 Tushar 一样,它已被编辑 - 在编辑之前,没有任何消息;-) 您不必担心内存问题。如果你的应用程序太大以至于你有内存问题,你应该考虑原生编程。 Cordova 是一个 web 视图。我们有包含大量库的应用程序,并且绝对没有已知的内存问题。刚刚查了一下,我们的一位客户的最大应用程序:27 个库。 (工作就像一个魅力)
    【解决方案4】:

    你可以试试:

    var clickEvent = ((document.ontouchstart!==null)?'click':'touchstart');
    $("#mylink").on(clickEvent, myClickHandler);
    

    【讨论】:

      【解决方案5】:

      对于 2021 年来到这里的任何人,请使用 pointers 事件,并检查 pointerType 以区分鼠标、触摸和笔。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多