$(document).click()在iPhone上无法正常工作.jQuery的

Gar*_*ows 110 javascript iphone jquery click onclick

此功能在IE,Firefox和Chrome上完美运行,但在iPhone上,只有在点击时才能使用<img>.点击页面(在img上的任何地方)都不会触发事件.

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

function fire(e) { alert('hi'); }
Run Code Online (Sandbox Code Playgroud)

HTML部分非常基础,不应该是一个问题.

有任何想法吗?

Sim*_*ver 253

简短回答:

<style>
    .clickable-div 
    {
         cursor: pointer;
    }
</style>
Run Code Online (Sandbox Code Playgroud)

更长的回答:

重要的是要意识到,如果你只是使用<a>标签,一切都将按预期工作.您可以<a>在iPhone 上的常规链接上错误地单击或拖动,一切都像用户期望的那样.

我想你有任意不可点击的HTML - 例如包含无法包装的文本和图像的面板<a>.当我有一个我希望完全可点击的面板时,我发现了这个问题.

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

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

</div>
Run Code Online (Sandbox Code Playgroud)

要检测此div中任何位置的单击,我将使用带有data-hrefhtml属性的jQuery,如上所示(此属性由我自己发明,不是标准的jQuery或HTML数据属性.)

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

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

});
Run Code Online (Sandbox Code Playgroud)

无论您点击多少,这都适用于您的桌面浏览器,但不适用于iPad.

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

答案非常简单:只需设置CSS即可cursor: pointer.

<style>
    .clickable-div 
    {
         cursor: pointer;
    }
</style>
Run Code Online (Sandbox Code Playgroud)

这为桌面用户提供了额外的好处,可以通过手形图标指示该区域是可点击的.

感谢/sf/answers/343767371/

  • 你的一行'游标:指针;' 会给我促销.惊人!谢谢! (4认同)
  • 确保你的a-tag有一个href属性.否则它将无法工作 (3认同)
  • 是的,当答案如此简单时很好:-)但有点令人沮丧的是看到每个人都提出疯狂的JS解决方案,这是不必要的 (2认同)
  • 我永远不会猜到这将是iOS 8为了注册点击事件而需要的黑客,但我很高兴它能够运行!! (2认同)

Fáb*_*ima 33

改变这个:

$(document).click( function () {
Run Code Online (Sandbox Code Playgroud)

对此

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

也许这个解决方案不适合您的工作,并且如回复中所述,这不是最佳解决方案.请检查其他用户的其他修复程序.

  • 田田不!tada这太可怕了 - 至少如果你想在任意DIV上捕获'click'事件那么.你不能在不触发事件的情况下向上拖动屏幕.GRR (19认同)
  • 虽然大多数人认为这个答案很糟糕,但这个解决方案在一些(特定的)情况下可能非常方便.想象一下,例如你想关闭手机上的菜单点击这将是一个非常有效的解决方案! (12认同)
  • @MrWashinton是正确的,其他用户应该为他们的过度反应感到羞耻.对于几种特定情况,这是唯一可接受的方法. (8认同)
  • 同意@Simon_Weaver.这是一个糟糕的答案. (5认同)
  • 我不想听起来太吝啬,但是当我尝试这个时,这种行为太可怕了,这让我感到沮丧!(尽管我得到了我期待的确切行为)幸运的是(请参阅我的其他答案)有一个更好,非常简单的解决方案 (2认同)
  • 尽管这是一个糟糕的答案 - 重要的是人们看到它并意识到为什么不这样做(你甚至不能在不触发事件的情况下滚动屏幕)所以我希望它不会被删除 (2认同)

Gar*_*ows 30

添加以下代码有效.

问题是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);    
}
Run Code Online (Sandbox Code Playgroud)

  • 这真是太过分了 - 只需`游标:指针;`就是你所需要的 (8认同)

nru*_*tas 17

试试这个,只适用于iPhone和iPod,所以你不会让所有东西在chrome或firefox手机上变成蓝色;

/iP/i.test(navigator.userAgent) && $('*').css('cursor', 'pointer');
Run Code Online (Sandbox Code Playgroud)

基本上,在iOS上,默认情况下它们不是"可点击的" - 它们是"可触摸的"(pfffff)所以你通过给它们一个指针光标使它们"可点击".总的来说,对吧?

  • 这确实效率低下,并且不考虑以后添加的元素。最好将指针 css 根据需要添加到确实需要它的元素中(请记住,`&lt;a&gt;` 标签一开始就不需要它),而不是像这样全局添加。如果这真的是你选择做的,你应该有一个像 `html.cursorpointer * { cursor: pointer }` 这样的 css 规则,然后使用你喜欢的方法将 `.cursorpointer` 添加到 `&lt;html&gt;` - 最好作为 Modernizr 测试 (2认同)