绑定'touchstart'和'click'时防止鬼点击

wil*_*fun 14 mobile jquery

我正在开发一个应用程序,在我的桌面和移动设备上进行测试.我正在尝试修复移动设备上的这些慢速按钮,并了解了touchstart和click之间的区别.

所以我用jquery绑定我的按钮来执行touchstart和点击,如下所示:

$('.button').on('touchstart click', function(){
});
Run Code Online (Sandbox Code Playgroud)

现在该应用程序在手机上的表现稍好一些.但是,它正在执行触摸点击,然后定期点击,即可能双击,或者当下一张幻灯片进入时,它会点击那里的某些内容.在我的情况下,表单正在出现,并且选中了单击按钮所在的空间中显示的输入字段.鬼点击.

我怎么能告诉我的功能,如果有触摸,忽略点击?

或者更好的是,有没有办法告诉jquery只是承认所有"点击"的触摸?

我会删除'click'绑定,但是我无法在桌面环境中轻松测试.

Kri*_*hna 23

如果你想为不同的事件类型使用特定的东西 e.type

$('.button').on('touchstart click', function(e) {    
    e.preventDefault(); //prevent default behavior
    if(e.type == "touchstart") {
        // Handle touchstart event.
    } else if(e.type == "click") {
        // Handle click event.
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这并不能阻止在Firefox中触发click事件(到目前为止我只测试了一个).它只是两者兼而有之,如果你想在移动设备中使用与在桌面浏览器中相同的行为,它*仍然*执行该操作两次. (7认同)
  • `e.stopPropagation()`不会阻止第二个事件被触发.`e.preventDefault()`会做到这一点. (4认同)

Sla*_*ack 12

Touchstart应该在点击之前发生,所以如果事件是touchstart类型,我会删除点击处理程序.这似乎很适合我的目的:

$('.do-popdown').on('click touchstart', handlePopdown);
function handlePopdown(e){
    if(e.type == 'touchstart') {
        $('.do-popdown').off('click', handlePopdown).click(function(e){
            // do nothing
            e.stopPropagation();
            e.preventDefault();
            return false;
        });
    }
    // do my handling...
    // and nothing else:
    e.stopPropagation();
    e.preventDefault();
    return false;
}
Run Code Online (Sandbox Code Playgroud)

e.stopPropagation(); e.preventDefault(); return false;可能是矫枉过正,但我用这个在各种不同的元素(的<a>,<div>,<span>,<button>,&C),这符合我一贯的需求.

编辑:更通用(更好?)的方法是创建类似于熟悉的.click()事件绑定器:

jQuery.fn.extend({
    clickOrTouch: function(handler) {
        return this.each(function() {
            var event = ('ontouchstart' in document) ? 'touchstart' : 'click';
            $(this).on(event, handler);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

这样,只有适当的事件附加到所选元素.

我想一个更"正确"的名字,.touchstartOrClick()但因为它或多或少是一个替代品,.click()我决定用这个名字开始click.

这可以像使用一样使用.click().例如,放入button一个div并运行:

$('button').clickOrTouch(doSomething);
$('div').clickOrTouch(doSomething);
function doSomething(e) {
    $('body').append(this.tagName + ' ' + e.type + '<br>');
    e.stopPropagation();
}
Run Code Online (Sandbox Code Playgroud)

这将显示"DIV click"或"BUTTON touchstart",具体取决于它是如何触发的.如果在链接上使用此选项,请e.preventDefault()在处理程序中添加(如果需要).

  • 请注意,对于具有鼠标和触摸事件等设备的设备,仅检测设备上的触摸事件是不够的,并且由于触摸而取消绑定点击事件可能会禁用鼠标点击. (3认同)
  • 你永远不应该为`touchstart`或`click`附加处理程序,因为有些设备会同时使用:一个用于使用触摸屏,另一个用于使用鼠标/触控板. (2认同)