2012-02-22 67 views
15

由于touchstart/touchend在大多数桌面浏览器中尚未支持。如何创建与mousedown事件相同的touchstart事件(所有浏览器均支持该事件)。浏览器中的jquery touchstart

我想是这样的

$('obj').bind('touchstart', function(e){ 
}); 

将被翻译成

$('obj').bind('mousedown', function(e){ 
}) 

回答

24

您可以一次地结合......

$('obj').bind('touchstart mousedown', function(e){ 
}); 

如果你想mousedown事件自动消防touchstart事件(所以你只需要绑定touchstart)使用...

$(document).bind('mousedown', function(event) { 
    $(event.target).trigger('touchstart'); 
}); 

注意,这意味着自定义touchstart事件可以触发之前mousedown事件必须传播到document。这可能会有意想不到的副作用。

+3

这些解决方案可能被证明是有点问题,如果在某些时候这两个事件将由sa支持我的设备。 – epeleg 2012-06-21 07:54:34

+0

@epeleg当然。在这种情况下,你会在文档或类似文件中使用''ontouchstart''的代码,然后相应地选择你的事件名称。 – alex 2014-02-14 23:18:43

+0

也许像'if(Modernizr.touchstart){}'会是合适的吗? – philtune 2015-01-30 14:18:08

7

尝试是这样的:

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

$('obj').bind(clickEventType, function(e){}); 

更重要的是,使用。对()进行绑定:

$('body').on(clickEventType, 'obj', function(e){}); 

此检查文件,看是否存在touchstart,如果这样做,那么你的活动如果它不是(大多数桌面浏览器),那么它是'touchstart',然后是'click'。

您也可以触发使用相同的事件类型:

$('obj').trigger(clickEventType); 
+0

我也要求它,所以你可以复制和粘贴整个事情:https://gist.github.com/esteinborn/9398782 – 2014-03-06 20:32:00

1

这不是最好的解决办法,但我发现到现在最好的。倒台?它只能在首先触摸发生,所以你不能同步使用:(

var isTouch = false; 
$('body').on('touchstart', function() { 
    isTouch = true; 
}); 

您也可以检查,如果浏览器支持触摸先用Modernizr的例如。

记得做在全球范围内不使用它(除非你必须),你也可以通过在isTouch = true代码后添加is-touch-device class到Html标签来将其更改为“modernizr”类似的代码:$('html').addClass('is-touch-device')。在这种情况下,你可以从任何地方引用它(也可以从css)