【问题标题】:$(document).click() not working correctly on iPhone. jquery [duplicate]$(document).click() 在 iPhone 上无法正常工作。 jQuery [重复]
【发布时间】:2011-04-11 23:31:27
【问题描述】:

此功能在 IE、Firefox 和 Chrome 上完美运行,但在 iPhone 上,它仅在单击 <img> 时才有效。单击页面(除 img 之外的任何位置)不会触发该事件。

$(document).ready(function () {
  $(document).click(function (e) {
    fire(e);
  });
});

function fire(e) { alert('hi'); }

HTML 部分非常基础,不应该成为问题。

有什么想法吗?

【问题讨论】:

  • 我的理解是,在 iPhone 上你从来没有真正引发点击事件......不是有类似触摸事件的东西吗?
  • 克里斯托弗可能会。它只是示例代码。
  • 最近遇到这个问题,你只需要cursor: pointer 或者使用一个默认应该有的元素,比如abutton 等。

标签: javascript jquery iphone click onclick


【解决方案1】:

简答:

<style>
    .clickable-div 
    {
         cursor: pointer;
    }
</style>

更长的答案:

重要的是要意识到,如果您只使用&lt;a&gt; 标签,一切都会按预期工作。您可以在 iPhone 上的常规 &lt;a&gt; 链接上错误地单击或拖动,一切都会按照用户的预期进行。

我想您有不可点击的任意 HTML - 例如包含无法用 &lt;a&gt; 包装的文本和图像的面板。当我有一个想要完全可点击的面板时,我发现了这个问题。

<div class='clickable-div' data-href="http://www.stackoverflow.com">

 ... clickable content here (images/text) ...

</div>

为了检测此 div 中的任何位置的点击,我使用带有 data-href html 属性的 jQuery,如上所示(此属性是我自己发明的,不是标准的 jQuery 或 HTML 数据属性。)

$(document).on('click', '.clickable-div', function() {

    document.location = $(this).data('href');

});

这将在您的桌面浏览器上有效,但在 iPad 上无效,无论您点击多少次。

您可能很想将事件处理程序从 click 更改为 click touchstart - 这确实会触发事件处理程序。但是,如果用户想要向上拖动页面(滚动),他们也会触发它——这是一种糟糕的用户体验。 [你可能已经通过偷偷摸摸的横幅广告注意到了这种行为]

答案非常简单:只需设置 css cursor: pointer

<style>
    .clickable-div 
    {
         cursor: pointer;
    }
</style>

这为桌面用户带来了额外的好处,即通过手形图标指示该区域是可点击的。

感谢https://stackoverflow.com/a/4910962/16940

【讨论】:

  • 是的,答案很简单很好 :-) 但是看到每个人都提出不必要的疯狂 JS 解决方案有点令人沮丧
  • 我从没想到这会是 iOS 8 注册点击事件所需的 hack,但我很高兴它可以工作!!
  • 我只想在用户点击任意位置时关闭一个 div :'(
  • 确保您的 a-tag 具有 href-property。否则就不行了
  • 你的一行'cursor:pointer;'会给我促销。惊人的!谢谢!
【解决方案2】:

改变这个:

$(document).click( function () {

到这里

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

也许这个解决方案不适合你的工作,就像回复中描述的那样,这不是应用的最佳解决方案。请检查其他用户的其他修复。

【讨论】:

  • 多田不! tada 这太可怕了——至少如果你想在任意 DIV 上捕获“点击”事件,它就是这样。你甚至不能在不触发事件的情况下向上拖动屏幕。 grr
  • 同意@Simon_Weaver。这是一个糟糕的答案。
  • 我不想听起来太刻薄,但是当我尝试这样做时,这种行为非常糟糕,让我感到沮丧! (即使我得到了我所期望的确切行为)幸运的是(请参阅我的其他答案)有一个更好、非常简单的解决方案
  • 虽然大多数人将此答案描述为糟糕透顶,但此解决方案在某些(特定)情况下可能非常方便。想象一下,例如,您想在点击时关闭移动设备上的菜单,这将是一个非常有效的解决方案!
  • @MrWashinton 是正确的,其他用户应该为他们的过度反应感到羞耻。这是几种特定情况下唯一可接受的方法。
【解决方案3】:

添加以下代码有效。

问题是 iPhone 不会引发点击事件。他们引发“触摸”事件。非常感谢苹果。为什么他们不能像其他人一样保持标准?无论如何,感谢 Nico 的提示。

感谢:http://ross.posterous.com/2008/08/19/iphone-touch-events-in-javascript

$(document).ready(function () {
  init();
  $(document).click(function (e) {
    fire(e);
  });
});

function fire(e) { alert('hi'); }

function touchHandler(event)
{
    var touches = event.changedTouches,
        first = touches[0],
        type = "";

    switch(event.type)
    {
       case "touchstart": type = "mousedown"; break;
       case "touchmove":  type = "mousemove"; break;        
       case "touchend":   type = "mouseup"; break;
       default: return;
    }

    //initMouseEvent(type, canBubble, cancelable, view, clickCount, 
    //           screenX, screenY, clientX, clientY, ctrlKey, 
    //           altKey, shiftKey, metaKey, button, relatedTarget);

    var simulatedEvent = document.createEvent("MouseEvent");
    simulatedEvent.initMouseEvent(type, true, true, window, 1, 
                          first.screenX, first.screenY, 
                          first.clientX, first.clientY, false, 
                          false, false, false, 0/*left*/, null);

    first.target.dispatchEvent(simulatedEvent);
    event.preventDefault();
}

function init() 
{
    document.addEventListener("touchstart", touchHandler, true);
    document.addEventListener("touchmove", touchHandler, true);
    document.addEventListener("touchend", touchHandler, true);
    document.addEventListener("touchcancel", touchHandler, true);    
}

【讨论】:

  • 我的 ipod 在添加此代码后挂了。还有其他方法吗?
  • 基本链接导致页面不可用错误
  • 这实在是太过分了——你只需要cursor: pointer;就够了
【解决方案4】:

试试这个,仅适用于 iPhone 和 iPod,这样您就不会在 chrome 或 firefox mobile 上让所有东西都变成蓝色;

/iP/i.test(navigator.userAgent) && $('*').css('cursor', 'pointer');

基本上,在 iOS 上,默认情况下事物不是“可点击的”——它们是“可触摸的”(pfffff),因此您可以通过给它们一个指针光标使它们“可点击”。完全有道理,对吧??

【讨论】:

  • 我认为在很多情况下这是最聪明和最短的选择
  • 这确实是低效的,并没有考虑到后来添加的元素。最好将指针 css 根据需要添加到确实需要它的元素中(请记住,&lt;a&gt; 标记首先不需要它),而不是像这样在全局范围内。如果这真的是你选择做的,你应该有一个像 html.cursorpointer * { cursor: pointer } 这样的 css 规则,然后使用你喜欢的方法将 .cursorpointer 添加到 &lt;html&gt; - 最好作为 Modernizr 测试
【解决方案5】:

CSS Cursor:Pointer; 是一个很好的解决方案。 FastClick https://github.com/ftlabs/fastclick 是另一种解决方案,如果您出于某种原因不想在元素上使用 Cursor:Pointer;,则不需要更改 css。我现在无论如何都使用 fastclick 来消除 iOS 设备上 300 毫秒的延迟。

【讨论】:

    【解决方案6】:

    在移动 iOS 上,点击事件不会冒泡到文档正文,因此不能与 .live() 事件一起使用。如果您必须使用非原生可点击元素(如 div 或部分),请在您的 CSS 中使用 cursor:pointer; 来实现非悬停在相关元素上。如果这很难看,您可以查看 delegate()。

    【讨论】:

      【解决方案7】:

      改用jQTouch - 它的 jQuery 移动版

      【讨论】:

      • jQuery的官方手机版是jQuery Mobile(不过jQTouch也不错)。
      • 已经可以下载了吗?上次我听说它仍然是概念性的
      • 很遗憾,它没有用。我只包含库而不更改我的javascript。似乎 jQTouch 应该重载 $(document).click 函数。
      【解决方案8】:

      将此添加到您的项目中。检查 github 上的“自述文件”。 https://github.com/tomasz-swirski/iOS9-Safari-Click-Fix

      【讨论】:

      • 链接有时会消失:考虑复制有关此软件包如何解决问题的说明,并包含链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多