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

时间:2010-09-14 03:33:11

标签: javascript jquery iphone click onclick

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

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

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

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

有什么想法吗?

8 个答案:

答案 0 :(得分:244)

简答:

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

更长的回答:

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

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

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

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

</div>

要检测此div中任何位置的单击,我使用的jQuery具有data-href html属性,如上所示(此属性由我自己发明,不是标准的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

答案 1 :(得分:30)

改变这个:

$(document).click( function () {

到此

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

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

答案 2 :(得分:28)

添加以下代码。

问题是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);    
}

答案 3 :(得分:17)

尝试此操作,仅适用于iPhone和iPod,因此您无法在Chrome或Firefox移动设备上将所有内容变为蓝色;

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

基本上,在iOS上,事情不是可点击的&#34;默认情况下 - 他们可以触摸&#34; (pfffff)所以你让它们可以点击&#34;通过给它们一个指针光标。总的来说,对吧?

答案 4 :(得分:2)

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

答案 5 :(得分:1)

在移动iOS上,点击事件不会冒泡到文档正文,因此无法与.live()事件一起使用。如果必须使用非本机可点击元素(如div或section),则在css中使用 cursor:pointer; 表示非悬停在相关元素上。如果这很难看,你可以查看delegate()。

答案 6 :(得分:0)

使用jQTouch代替 - jQuery的移动版

答案 7 :(得分:0)

将此信息包含在您的项目中。检查&#34;自述文件&#34;在github上。 https://github.com/tomasz-swirski/iOS9-Safari-Click-Fix