触摸设备的文档.click功能


67

我有一个使用jquery的子导航-用户单击顶层列表项,例如触发下拉菜单的“服务”。通过单击“服务”链接可以切换下拉菜单。我做到了,以便用户可以单击屏幕上的任意位置以将下拉列表切换到关闭状态。但是,由于该站点具有响应能力,因此我希望用户能够在屏幕上的任意位置单击(触摸)以关闭下拉菜单,但是我的问题是它无法在触摸设备上正常工作。

我的文档单击代码设置为:

$(document).click(function(event) { 

  if ( $(".children").is(":visible")) {
    $("ul.children").slideUp('slow');
  }

});

我假设document.click可能无法在触摸设备上使用,如果不能,那么有什么解决方法可以达到相同的效果?

谢谢


尝试将click事件附加到$('html')$('body')代替。
millimoose 2012年

只需包含cursor:pointer,它将可以在此处输入链接描述感谢:->
Devika B

Answers:


163

要通过单击或触摸触发功能,您可以更改此设置:

$(document).click( function () {

对此:

$(document).on('click touchstart', function () {

或这个:

$(document).on('click touch', function () {

touchstart事件在元素被触摸时立即触发,该touch事件更像是“轻击”,即表面上的单个接触。您应该真正尝试其中的每一种,以找出最适合您的方法。在某些设备上,touch触发起来可能会有些困难(这可能是好事,也可能是坏事-它阻止了阻力的计算,但是意外的阻力会导致其不被触发)。


8
“触摸”可能比“触摸开始”更好。当然,这取决于情况,但是touchstart会导致我们的应用程序发生奇怪的行为(例如,当我们显示弹出窗口时,在touchstart上将其关闭-触摸事件将传播到下面的元素中)。
Szorstki 2014年

根据@Szorstki的评论,也许可以更改此答案touch以代替touchstart
alexwc_

4
以我为例,我发现“触摸”不起作用(通过点击其他位置来关闭下拉菜单)。在当前的iPad上轻按文档不会触发触摸事件。只有touchstart可以完成这项工作。
Nigel B. Peck

1
还有一个点击活动
Muneeb Mirza,

48

touchstart或touchend不好,因为如果滚动页面,设备会做事。因此,如果我想通过点击关闭窗口或在元素外部单击并滚动窗口,则可以完成以下操作:

$(document).on('touchstart', function() {
    documentClick = true;
});
$(document).on('touchmove', function() {
    documentClick = false;
});
$(document).on('click touchend', function(event) {
    if (event.type == "click") documentClick = true;
    if (documentClick){
        doStuff();
    }
 });

3
智能解决方案,ty
gmustudent

1
智能解决方案大师。Thx
Venki

1
它被双重触发。
罗曼·洛舍夫

什么样的解决方案真是太棒了
Atul Rajput


3

如上所述,使用'click touchstart'将获得所需的结果。如果console.log(e)您单击,则可能会发现当jquery将touch识别为单击时-您将从click和touchstart中获得2个操作。下面的解决方案为我工作。

//if its a mobile device use 'touchstart'
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
    deviceEventType = 'touchstart'
} else {
//If its not a mobile device use 'click'
    deviceEventType = 'click'
}

$(document).on(specialEventType, function(e){
    //code here
});

有些台式机带有触摸显示屏,因此建议不要仅绑定两个事件之一。
Martin Braun

2

要将其应用于任何地方,您可以执行以下操作

$('body').on('click', function() {
   if($('.children').is(':visible')) {
      $('ul.children').slideUp('slow');
   }
});

1
我以为这可以正常工作,但是在iPhone / iPad上似乎不起作用。我正在研究Jquery mobile,但我想避免将其添加到
Doidgey 2012年

@ MAT-视觉看看.bind().unbind()click事件。我也遇到了同样的问题。
ayyp

是的,我一直沿着这些路线看。我刚刚尝试过$(document).bind('click',function(){-但由于某种奇怪的原因仍然不走运。我必须缺少某些东西,也许是冲突。尽管在正常的PC浏览器上工作正常
Doidgey

@ Mat-visual通过执行类似的操作来解决它,function bindTap() { $('element').bind("click", function(e){} ); $("element").click(function(){ //DO SOMETHING $("element").unbind("click"); }); }然后在某处的click事件上调用该函数。.click在iOS上的问题在于,它取消了click事件的绑定。
ayyp

1
我想您一定会喜欢我会尝试的东西,看看我能否使其正常运行,谢谢,如果成功了,我会通知您。
Doidgey

1

批准的答案不包括必要的return false,以防止在实施点击的情况下touchstart调用click,这将导致运行处理程序twoce。

做:

$(btn).on('click touchstart', e => { 
   your code ...
   return false; 
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.