【问题标题】:iPad/iPhone hover problem causes the user to double click a linkiPad/iPhone 悬停问题导致用户双击链接
【发布时间】:2011-03-03 14:33:08
【问题描述】:

我有一些我以前建立的网站,使用 jquery 鼠标事件...我刚得到一个 ipad,我注意到所有鼠标悬停事件都在点击中翻译...所以例如我必须点击两次而不是一个..(第一次悬停,而不是实际点击)

是否有准备好解决此问题的解决方法?也许我应该使用 jquery 命令而不是 mouseover/out 等。 谢谢!

【问题讨论】:

  • 您的事件绑定到什么?例如onclick 事件应该可以正常工作... onmouseover、onmouseout 和 CSS :hover 是有点难以处理的,因为触摸屏没有可用的“悬停”。有代码示例吗?
  • 我建议您做的一件事是尽可能重新考虑您的界面。 ipad/iphone 上的交互并不完全反映在 pc 上的交互,让您的网站感觉它是为 ipad/iphone/其他具有类似多点触控机制的触控设备编写的可能是明智之举。只是一个想法。
  • 我同意“jer”。这是一个奇怪的问题,我个人认为这里的解决方案不是“解决方法”。我认为将桌面浏览器上的“鼠标悬停”转换为触摸屏浏览器上的“手指点击”是有意义的。如果您同意该翻译,但想要一次而不是两次,那么我可能会对 iPad 事件(例如“touchstart”)进行功能检测并更改您的事件处理程序。也许将您的代码提取到 jquery 插件“触摸或单击”类型的功能中,该功能会根据功能不同触发,但对我来说似乎特定于您的网站/应用程序。
  • 我实际上认为这个翻译是一个特点。如果您设置了悬停事件,那么一定有一些实用程序可以查看它们。单击一下会显示一个悬停的元素,第二次轻点会跟随悬停“后面”的链接。

标签: jquery ipad hover mouseover


【解决方案1】:

尚未对此进行全面测试,但由于 iOS 会触发触摸事件,因此假设您处于 jQuery 设置中,这可能会起作用。

$('a').on('click touchend', function(e) {
    var el = $(this);
    var link = el.attr('href');
    window.location = link;
});

这个想法是 Mobile WebKit 在点击结束时触发 touchend 事件,因此我们会侦听该事件,然后在链接上触发 touchend 事件后立即重定向浏览器。

【讨论】:

  • 耐心点,帕德万。所以。说需要24小时才能生效。
  • 从 jQuery 1.7 开始,.on 优先于 .live。阅读此答案后,我发现将代码更改为 $('a').on('click touchend', function(e) {...}) 效果很好。
  • 嗯,这解决了最初的问题,但创建了一个新问题:当滑动时点击。这不是解决方案。
  • 这对我来说感觉像是一个 hack,苹果已经记录了触摸事件的行为 (developer.apple.com/library/iOS/#documentation/…)。这篇文章有助于确保您的网站适应这种行为 -> nczonline.net/blog/2012/07/05/ios-has-a-hover-problem 基本上,不要在悬停时隐藏/显示 JS 或 CSS 内容,这样就不会出现双击问题。
  • 这有其缺陷。如果您单击带有target="_blank" 的链接,它将在同一窗口和新窗口中打开。
【解决方案2】:

不完全清楚你的问题是什么,但如果你只是想消除双击,同时保留鼠标悬停效果,我的建议是:

  • touchstartmouseenter 上添加悬停效果。
  • 移除mouseleavetouchmoveclick 上的悬停效果。

背景

为了模拟鼠标,如果用户在触摸屏(如 iPad)上触摸并释放手指,Webkit mobile 等浏览器会触发以下事件(来源:html5rocks.com 上的Touch And Mouse):

  1. touchstart
  2. touchmove
  3. touchend
  4. 300 毫秒延迟,浏览器确保这是单击,而不是双击
  5. mouseover
  6. mouseenter
    • 注意:如果mouseovermouseentermousemove 事件更改了页面内容,则永远不会触发以下事件。
  7. mousemove
  8. mousedown
  9. mouseup
  10. click

似乎不可能简单地告诉网络浏览器跳过鼠标事件。

更糟糕的是,如果鼠标悬停事件更改了页面内容,则永远不会触发 click 事件,如 Safari Web Content Guide - Handling Events 中所述,特别是 One-Finger Events 中的图 6.4。 “内容更改”究竟是什么,将取决于浏览器和版本。我发现对于 iOS 7.0,背景颜色的更改不是(或不再是?)内容更改。

解决方案说明

回顾一下:

  • touchstartmouseenter 上添加悬停效果。
  • 移除mouseleavetouchmoveclick 上的悬停效果。

请注意,touchend 上没有任何操作!

这显然适用于鼠标事件:mouseentermouseleavemouseovermouseout 的略微改进版本)被触发,并添加和删除悬停。

如果用户实际上clicks 一个链接,悬停效果也会被移除。这确保如果用户在 Web 浏览器中按下后退按钮,它会被删除。

这也适用于触摸事件:在touchstart 上添加了悬停效果。它在touchend 上被“删除”。它在mouseenter 上再次添加,并且由于这不会导致内容更改(它已经添加),因此click 事件也会被触发,并且无需用户再次点击链接!

浏览器在touchstart 事件和click 之间的 300 毫秒延迟实际上得到了很好的利用,因为悬停效果会在这很短的时间内显示出来。

如果用户决定取消点击,手指的移动将照常执行。通常,这是一个问题,因为没有触发 mouseleave 事件,并且悬停效果仍然存在。值得庆幸的是,可以通过移除 touchmove 上的悬停效果轻松解决此问题。

就是这样!

请注意,可以删除 300 毫秒的延迟,例如使用 FastClick library,但这超出了本问题的范围。

替代解决方案

我发现以下替代方案存在以下问题:

  • 浏览器检测:极易出错。假设设备具有鼠标或触控功能,而当触控显示器激增时,两者的结合将变得越来越普遍。
  • CSS 媒体检测: 我所知道的唯一纯 CSS 解决方案。仍然容易出错,并且仍然假定设备具有鼠标或触摸功能,而两者都是可能的。
  • 模拟touchend 中的点击事件:这将错误地跟随链接,即使用户只想滚动或缩放,而没有实际点击链接的意图。
  • 使用变量来抑制鼠标事件: 这会在touchend 中设置一个变量,该变量用作后续鼠标事件中的 if 条件,以防止在该时间点发生状态更改。变量在点击事件中被重置。如果您真的不希望在触摸界面上产生悬停效果,这是一个不错的解决方案。不幸的是,如果touchend 因其他原因被触发并且没有触发点击事件(例如用户滚动或缩放),并且随后尝试用鼠标跟踪链接(即在同时使用鼠标的设备上),这不起作用和触摸界面)。

进一步阅读

另请参阅 iPad/iPhone double click problemDisable hover effects on mobile browsers

【讨论】:

  • 对于那些想要更准确的问题解决方案的人来说似乎是最好的解释。谢谢
  • 特别感谢有关 >iOS7 的背景颜色的信息。我花了一些时间试图弄清楚这何时开始起作用。
【解决方案3】:

似乎毕竟有一个 CSS 解决方案。 Safari 等待第二次触摸的原因是您通常在 :hover 事件中分配的背景图像(或元素)。如果没有要显示的 - 你不会有任何问题。解决方案是使用辅助 CSS 文件(或在 JS 方法的情况下为样式)定位 iOS 平台,该文件覆盖 :hover 背景以继承例如并隐藏您将在鼠标悬停时显示的元素:

这是一个 CSS 和 HTML 示例 - 鼠标悬停时带有星号标签的产品块:

HTML:

<a href="#" class="s"><span class="s-star"></span>Some text here</a>

CSS:

.s {
   background: url(some-image.png) no-repeat 0 0;

}
.s:hover {
   background: url(some-image-r.png) no-repeat 0 0;
}

.s-star {
   background: url(star.png) no-repeat 0 0;
   height: 56px;
   position: absolute;
   width: 72px;
   display:none;
}

.s:hover .s-star {
   display:block;
}

解决方案(二级 CSS):

/* CSS */
/* Keep hovers the same or hidden */
.s:hover {
   background:inherit;
}
.s:hover .s-star {
   display:none;
}

【讨论】:

【解决方案4】:

不必过于复杂。

$('a').on('touchend', function() {
    $(this).click();
});

【讨论】:

    【解决方案5】:

    对我有用的是这里其他人已经说过的:

    不要在悬停或鼠标移动时显示/隐藏元素(这就是我的情况)。

    这是 Apple 所说的 (https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html):

    可点击元素是链接、表单元素、图像地图区域或任何其他带有 mousemove、mousedown、mouseup 或 onclick 处理程序的元素

    如果用户点击一个可点击元素,事件按以下顺序到达:mouseover、mousemove、mousedown、mouseup 和 click。此外,如果页面内容在 mousemove 事件中发生变化,则不会发送序列中的后续事件。此行为允许用户点击新内容。

    所以,您可以使用@woop 的解决方案:检测 userAgent,检查它是否和 iOS 设备,然后绑定事件。我最终使用了这种技术,因为它适合我的需要,并且当你不想要它时不要绑定悬停事件更有意义。

    但是...如果您不想弄乱 userAgents 并且仍然在悬停/鼠标移动时隐藏/显示元素,我发现您可以使用本机 javascript 来做到这一点,如下所示:

    $("body").on("mouseover", function() {
           document.getElementsByTagName("my-class")[0].style.display = 'block'; //show element
           document.querySelector(".my-selector div").style.display = 'none'; // hide element
    });
    

    这将在桌面版本上运行,而在移动版本上不起作用。

    为了获得更多的兼容性...

    $("body").on("mouseover", function() {
       if (document.getElementsByTagName && document.querySelector) { // check compatibility
           document.getElementsByTagName("my-class")[0].style.display = 'block'; //show element
           document.querySelector(".my-selector div").style.display = 'none'; // hide element
        } else {
            $(".my-class").show();
            $(".my-selector div").hide();
        }
    });
    

    【讨论】:

    • 那位“如果页面内容在 mousemove 事件上发生变化,则不会发送序列中的后续事件”确实为我做了。我有一个页面,其中标题链接需要双击,其中内容中的按钮(在 em 上有所有快乐的 css3 转换)只需要单击一下。似乎标题链接有一个伪元素,在悬停时从 opacity: 0 变为 opacity: 1。删除该效果立即解决了问题,我找到了一个 CSS 解决方法,仍然可以获得我想要的外观。
    【解决方案6】:

    cduruk 的解决方案非常有效,但在我的网站的某些部分引起了问题。因为我已经在使用 jQuery 添加 CSS hover 类,所以最简单的解决方案就是不在移动设备上添加 CSS hover 类(或者更准确地说,只在不在移动设备上时添加它)。

    总体思路如下:

    var device = navigator.userAgent.toLowerCase();
    var ios = device.match(/(iphone|ipod|ipad)/);
    
    if (!(ios)) {
        $(".portfolio-style").hover(
            function(){
                $(this).stop().animate({opacity: 1}, 100);
                $(this).addClass("portfolio-red-text");
            },
            function(){
                $(this).stop().animate({opacity: 0.85}, 100);
                $(this).removeClass("portfolio-red-text");
            }
        );
    }
    

    *为说明目的而减少代码

    【讨论】:

    • 这显然是答案。其他“解决方案”不能解决问题。 iOS safari 显然有缺陷,认为我们首先要悬停。当您将鼠标悬停在某个项目上时,其他操作系统具有实际的悬停功能。
    • 这是唯一对我有用的东西。非常感谢!
    【解决方案7】:

    我在现有解决方案中遇到了以下问题,并找到了似乎可以解决所有问题的方法。这假设您的目标是跨浏览器、跨设备,并且不希望设备嗅探。

    解决的问题

    仅使用touchstarttouchend

    • 当人们试图滚动浏览内容并且在他们开始滑动时碰巧将手指放在此元素上时触发事件 - 意外触发操作。
    • 可能会导致事件在长按时触发,类似于在桌面上单击鼠标右键。例如,如果您的点击事件转到 URL X,并且用户长按以在新选项卡中打开 X,则用户会混淆地发现 X 在两个选项卡中都打开。在某些浏览器(例如 iPhone)上,它甚至可能会阻止长按菜单出现。

    touchstart 上触发mouseover 事件和在touchmove 上触发mouseout 的后果不太严重,但会干扰通常的浏览器行为,例如:

    • 长按会触发永不结束的鼠标悬停。
    • 许多 Android 浏览器将手指在touchstart 上的位置视为mouseover,即下一个touchstart 上的mouseouted。因此,在 Android 中查看鼠标悬停内容的一种方法是触摸感兴趣的区域并摆动手指,轻轻滚动页面。将 touchmove 视为 mouseout 会破坏这一点。

    解决方案

    理论上,您可以使用touchmove 添加一个标志,但即使没有移动,iPhone 也会触发 touchmove。理论上,你可以比较touchstarttouchend事件pageXpageYbut on iPhones, there's no touchend pageX or pageY

    不幸的是,要涵盖所有基础,它最终会变得更加复杂。

    $el.on('touchstart', function(e){
        $el.data('tstartE', e);
        if(event.originalEvent.targetTouches){
            // store values, not reference, since touch obj will change
            var touch = e.originalEvent.targetTouches[0];
            $el.data('tstartT',{ clientX: touch.clientX, clientY: touch.clientY } );
        }
    });
    $el.on('touchmove', function(e){
        if(event.originalEvent.targetTouches){
            $el.data('tstartM', event.originalEvent.targetTouches[0]);
        }
    });
    
    $el.on('click touchend', function(e){
        var oldE = $el.data('tstartE');
        if( oldE && oldE.timeStamp + 1000 < e.timeStamp ) {
            $el.data('tstartE',false);
            return;
        }
        if( $el.data('iosTouchM') && $el.data('tstartT') ){
            var start = $el.data('tstartT'), end = $el.data('tstartM');
            if( start.clientX != end.clientX || start.clientY != end.clientY ){
                $el.data('tstartT', false);
                $el.data('tstartM', false);
                $el.data('tstartE',false);
                return;
            }
        }
        $el.data('tstartE',false);
    

    理论上有ways to get the exact time used for a longpress instead of just using 1000 as an approximation, but in practice it's not that simple and it's best to use a reasonable proxy

    【讨论】:

      【解决方案8】:

      我认为用mouseenter 代替mouseover 是明智的。这是绑定到.hover(fn,fn) 时内部使用的,通常是您想要的。

      【讨论】:

        【解决方案9】:

        MacFreak 的回答对我非常有帮助。这里有一些动手代码,以防对您有所帮助。

        问题 - 应用 touchend 意味着每次您将手指滚动到某个元素上时,它的响应就像您按下它一样,即使您只是想滚动过去。

        我正在使用 jQuery 创建一个效果,它会在某些按钮下淡出一行以“突出显示”悬停的按钮。我不希望这意味着您必须在触摸设备上按两次按钮才能访问链接。

        这里是按钮:

        <a class="menu_button" href="#">
            <div class="menu_underline"></div>
        </a>
        

        我希望“menu_underline” div 在鼠标悬停时淡出并在鼠标移出时淡出。但我希望触摸设备能够单击一次而不是两次单击链接。

        解决方案 - 这是让它工作的 jQuery:

        //Mouse Enter
        $('.menu_button').bind('touchstart mouseenter', function(){
            $(this).find(".menu_underline").fadeIn();
        });
        
        //Mouse Out   
        $('.menu_button').bind('mouseleave touchmove click', function(){
            $(this).find(".menu_underline").fadeOut();
        });
        

        非常感谢您对这个 MacFreak 的帮助。

        【讨论】:

          【解决方案10】:

          我刚刚发现,如果你添加一个空的监听器,它会起作用,不要问我为什么,但我在 iPhone 和 iPad 上用 iOS 9.3.2 测试过它,它运行良好。

          if(/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){
              var elements = document.getElementsByTagName('a');
              for(var i = 0; i < elements.length; i++){
                  elements[i].addEventListener('touchend',function(){});
              }
          }
          

          【讨论】:

            【解决方案11】:

            我“认为”您的链接没有 onmouseover 事件,其中 1 次点击激活 onmouseover,双击激活链接。但是我想。我没有 iPad。 我认为你必须使用手势/触摸事件。

            https://developer.apple.com/documentation/webkitjs

            【讨论】:

              【解决方案12】:

              我有同样的问题,但不是在触控设备上。每次单击时都会触发该事件。有一些关于事件队列的东西。

              但是,我的解决方案是这样的: 在点击事件(或触摸?)上,您设置了一个计时器。如果在 X 毫秒内再次点击该链接,则返回 false。

              要设置每个元素的计时器,您可以使用$.data()

              这也可以解决上述@Ferdy 问题。

              【讨论】:

              • 你能贴出这段代码的样子吗?我遇到了点击事件被触发两次的问题。
              【解决方案13】:

              如果你使用Modernizr,如前所述,使用Modernizr.touch非常容易。

              但是,为了安全起见,我更喜欢结合使用 Modernizr.touch 和用户代理测试。

              var deviceAgent = navigator.userAgent.toLowerCase();
              
              var isTouchDevice = Modernizr.touch || 
              (deviceAgent.match(/(iphone|ipod|ipad)/) ||
              deviceAgent.match(/(android)/)  || 
              deviceAgent.match(/(iemobile)/) || 
              deviceAgent.match(/iphone/i) || 
              deviceAgent.match(/ipad/i) || 
              deviceAgent.match(/ipod/i) || 
              deviceAgent.match(/blackberry/i) || 
              deviceAgent.match(/bada/i));
              
              function Tipsy(element, options) {
                  this.$element = $(element);
                  this.options = options;
                  this.enabled = !isTouchDevice;
                  this.fixTitle();
              };
              

              如果你不使用Modernizr,你可以简单地将上面的Modernizr.touch函数替换为('ontouchstart' in document.documentElement)

              另请注意,与 Windows Phone 相比,测试用户代理 iemobile 将为您提供更广泛的检测到的 Microsoft 移动设备。

              【讨论】:

                【解决方案14】:

                你可以使用click touchend

                示例:

                $('a').on('click touchend', function() {
                    var linkToAffect = $(this);
                    var linkToAffectHref = linkToAffect.attr('href');
                    window.location = linkToAffectHref;
                });
                

                以上示例将影响触摸设备上的所有链接。

                如果你只想定位特定的链接,你可以通过在它们上设置一个类来做到这一点,即:

                HTML:

                &lt;a href="example.html" class="prevent-extra-click"&gt;Prevent extra click on touch device&lt;/a&gt;

                jQuery:

                $('a.prevent-extra-click').on('click touchend', function() {
                    var linkToAffect = $(this);
                    var linkToAffectHref = linkToAffect.attr('href');
                    window.location = linkToAffectHref;
                });
                

                干杯,

                杰伦

                【讨论】:

                  【解决方案15】:

                  我遇到了类似的情况,我将事件绑定到元素的 mouseenter/mouseleave/click 状态,但在 iPhone 上,用户必须双击元素才能首先触发 mouseenter 事件,然后再次触发点击事件。

                  我使用与上述类似的方法解决了这个问题,但我使用了 jQuery $.browser 插件(适用于 jQuery 1.9>)并在 mouseenter 绑定事件中添加了一个 .trigger 事件,如下所示:

                  // mouseenter event
                  $('.element').on( "mouseenter", function() {
                      // insert mouseenter events below
                  
                      // double click fix for iOS and mouseenter events
                      if ($.browser.iphone || $.browser.ipad) $(this).trigger('click');
                  });
                  // mouseleave event
                  $('.element').on( "mouseleave", function() { 
                      // insert mouseout events below
                  });
                  // onclick event
                  $('.element').on( "click", function() {
                      // insert click events below
                  });
                  

                  .trigger 通过在 iPhone 或 iPad 上查看元素时触发 .click 事件处理程序来避免双击元素的需要。可能不是最优雅的解决方案,但它在我的情况下效果很好,并且使用了我已经安装的插件,并且需要我添加一行代码来让我现有的事件在这些设备下工作。

                  您可以在此处获取 jQuery $.browser 插件:https://github.com/gabceb/jquery-browser-plugin

                  【讨论】:

                    【解决方案16】:

                    只是为了避免在您错误地在链接上滑动手指时重定向。

                    // tablet "one touch (click)" X "hover" > link redirection
                    $('a').on('touchmove touchend', function(e) {
                    
                        // if touchmove>touchend, set the data() for this element to true. then leave touchmove & let touchend fail(data=true) redirection
                        if (e.type == 'touchmove') {
                            $.data(this, "touchmove_cancel_redirection", true );
                            return;
                        }
                    
                        // if it's a simple touchend, data() for this element doesn't exist.
                        if (e.type == 'touchend' && !$.data(this, "touchmove_cancel_redirection")) {
                            var el = $(this);
                            var link = el.attr('href');
                            window.location = link;
                        }
                    
                        // if touchmove>touchend, to be redirected on a future simple touchend for this element
                        $.data(this, "touchmove_cancel_redirection", false );
                    });
                    

                    【讨论】:

                      【解决方案17】:

                      在 MacFreak 的启发下,我整理了一些适合我的东西。

                      这个 js 方法可以防止鼠标悬停在 ipad 上,并且在某些情况下可以防止点击注册为两次点击。在 CSS 中,如果你的 CSS 中有任何 :hover 伪类,请将它们更改为 .hover 例如 .some-class:hover 为 .some-class.hover

                      在 ipad 上测试这段代码,看看 css 和 js 悬停方法的行为有何不同(仅在悬停效果中)。 CSS 按钮没有花哨的点击警报。 http://jsfiddle.net/bensontrent/ctgr6stm/

                      function clicker(id, doStuff) {
                        id.on('touchstart', function(e) {
                          id.addClass('hover');
                        }).on('touchmove', function(e) {
                          id.removeClass('hover');
                        }).mouseenter(function(e) {
                          id.addClass('hover');
                        }).mouseleave(function(e) {
                          id.removeClass('hover');
                        }).click(function(e) {
                          id.removeClass('hover');
                          //It's clicked. Do Something
                          doStuff(id);
                        });
                      }
                      
                      function doStuff(id) {
                        //Do Stuff
                        $('#clicked-alert').fadeIn(function() {
                          $(this).fadeOut();
                        });
                      }
                      clicker($('#unique-id'), doStuff);
                      button {
                        display: block;
                        margin: 20px;
                        padding: 10px;
                        -webkit-appearance: none;
                        touch-action: manipulation;
                      }
                      .hover {
                        background: yellow;
                      }
                      .btn:active {
                        background: red;
                      }
                      .cssonly:hover {
                        background: yellow;
                      }
                      .cssonly:active {
                        background: red;
                      }
                      #clicked-alert {
                        display: none;
                      }
                      <button id="unique-id" class="btn">JS Hover for Mobile devices<span id="clicked-alert"> Clicked</span>
                      
                      </button>
                      <button class="cssonly">CSS Only Button</button>
                      <br>This js method prevents hover from sticking on an ipad, and prevents the click registering as two clicks. In CSS, if you have any :hover in your css, change them to .hover For example .some-class:hover to .some-class.hover

                      【讨论】:

                        【解决方案18】:

                        为了在不中断触摸滚动的情况下使链接正常工作,我使用 jQuery Mobile 的“tap”事件解决了这个问题:

                            $('a').not('nav.navbar a').on("tap", function () {
                                var link = $(this).attr('href');
                                if (typeof link !== 'undefined') {
                                    window.location = link;
                                }
                            });
                        

                        【讨论】:

                          【解决方案19】:

                          我知道我来晚了,但这是我发现的最简单的解决方法之一:

                              $('body').on('touchstart','*',function(){   //listen to touch
                                  var jQueryElement=$(this);  
                                  var element = jQueryElement.get(0); // find tapped HTML element
                                  if(!element.click){
                                      var eventObj = document.createEvent('MouseEvents');
                                      eventObj.initEvent('click',true,true);
                                      element.dispatchEvent(eventObj);
                                  }
                              });
                          

                          这不仅适用于链接(锚标签),也适用于其他元素。希望这会有所帮助。

                          【讨论】:

                            【解决方案20】:

                            这个简短的 sn-p 似乎有效。 点击链接时触发点击事件:

                              $('a').on('touchstart', function() {
                                $(this).trigger('click');
                              });
                            

                            【讨论】:

                              【解决方案21】:

                              其他答案中没有一个对我有用。我的应用程序有很多事件侦听器、自己的复选框和具有侦听器的链接和没有侦听器的链接。

                              我用这个:

                              var selector = "label, a, button";
                              var timer;
                              var startX;
                              var startY;
                              $(document).on("click", selector, function (e) {
                                  if ($(this).data("touched") === true) {
                                      e.stopImmediatePropagation();
                                      return false;
                                  }
                                  return;
                              }).on("touchend", selector, function (e) {
                                  if (Math.abs(startX - e.originalEvent.changedTouches[0].screenX) > 10 || Math.abs(startY - e.originalEvent.changedTouches[0].screenY) > 10)
                                      // user action is not a tap
                                      return;
                                  var $this = $(this);
                                  // Visit: http://stackoverflow.com/questions/1694595/can-i-call-jquery-click-to-follow-an-a-link-if-i-havent-bound-an-event-hand/12801548#12801548
                                  this.click();
                                  // prevents double click
                                  $this.data("touched", true);
                                  if (timer)
                                      clearTimeout(timer);
                                  setTimeout(function () {
                                      $this.data("touched", false);
                                  }, 400);
                                  e.stopImmediatePropagation();
                                  return false;
                              }).on("touchstart", function (e) {
                                  startX = e.originalEvent.changedTouches[0].screenX;
                                  startY = e.originalEvent.changedTouches[0].screenY;
                              });
                              

                              【讨论】:

                                【解决方案22】:

                                当你有 jquery ui 下拉菜单时,这对我有用

                                if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {
                                      $('.ui-autocomplete').off('menufocus hover mouseover');
                                }
                                

                                【讨论】:

                                  【解决方案23】:

                                  避免在悬停 css 事件中更改“显示”样式。我在悬停状态下有“显示:阻止”。删除 ios 后,通过单击继续 lins。顺便说一句,最新的 IOS 更新似乎修复了这个“功能”

                                  【讨论】:

                                    【解决方案24】:

                                    解决 iPad 上双击问题的最简单方法是在媒体查询 @media (pointer: fine) 中包装你的 css 以实现悬停效果:

                                    @media (pointer: fine) {
                                      a span {
                                        display: none;
                                      }
                                      a:hover span {
                                        display: inline-block;
                                      }
                                    }
                                    

                                    包含在此媒体查询中的 CSS 仅适用于桌面。

                                    这个解决方案的解释在这里https://css-tricks.com/annoying-mobile-double-tap-link-issue/

                                    【讨论】:

                                      【解决方案25】:

                                      您可以像这样检查navigator.userAgent

                                      if(!navigator.userAgent.match(/iPhone/i) || !navigator.userAgent.match(/iPad/i)) {
                                          //bind your mouseovers...
                                      }
                                      

                                      但您必须检查黑莓、机器人和大量其他触摸屏设备。您也可以仅当 userAgent 包含 Mozilla、IE、Webkit 或 Opera 时才绑定鼠标悬停,但您仍然需要筛选某些设备,因为例如 Droid 将其 userAgent 字符串报告为:

                                      Mozilla/5.0 (Linux; U; Android 2.0.1; en-us; Droid Build/ESD56) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
                                      

                                      iPhone 的字符串类似。如果您只筛选 iPhone、iPod、iPad、Android 和 Blackberry,您可能会得到大多数手持设备,但不是全部。

                                      【讨论】:

                                      • 我认为,就目前而言,为了不发疯,最好的办法可能只是一个跳过悬停事件的脚本......所以我想第一个答案很好......并且是的,你是对的..我应该考虑所有其他设备...我希望 Jquery 或某些插件具有这种检测功能..!
                                      • wurfl.sourceforge.net 这可能是你的答案。它是一个无线设备数据库。不会像 jQuery 插件那样简单,但你总是可以写一个!还有tera-wurfl.com 使用数据库而不是xml 文件。没有做太多的挖掘,但可能有一个托管版本,所以你不必担心保持你的 wurfl 文件或 tera-wurfl 数据库是最新的。
                                      • 我是否遗漏了什么,或者问题不是关于检测 iPad,而是关于解决 iPad 上的特定行为?
                                      【解决方案26】:

                                      只需进行一个不包括平板电脑和移动设备的 CSS 媒体查询,然后将鼠标悬停在那里。您实际上并不需要 jQuery 或 JavaScript。

                                      @media screen and (min-device-width:1024px) {
                                          your-element:hover {
                                              /* Do whatever here */
                                          }
                                      }
                                      

                                      并确保将其添加到您的 html 头中,以确保它使用实际像素而不是分辨率进行计算。

                                      <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 2013-09-12
                                        • 2011-11-26
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2020-10-18
                                        • 2016-09-13
                                        • 2021-08-03
                                        • 1970-01-01
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多