移动Safari和jQuery事件,什么都没有解雇?

时间:2012-08-30 23:51:16

标签: jquery ios html5 javascript-events mobile-safari

好的,所以我有一个用HTML5 / JavaScript编写的应用程序用于仪表板车。它是一个“单页”应用程序,在主页面上将片段加载到div中以响应不同的事件。

我被要求将其移植到浏览器中,以便它可以用于营销,演示等等。

这似乎不是什么大问题,因为几乎没有什么可以适应,只需要调整一些CSS,以便它可以在所有浏览器中显示相同。然后,他们决定他们想要运行webapp的设备就是iPad。

该应用程序在Safari中运行良好,所以我认为我对Mobile Safari没有任何问题。马上意识到事实并非如此。该应用程序在Mobile Safari中根本不起作用!基本上,我的点击事件都没有被触发。最重要的是,我在我的控制台中收到了不一致的错误消息,这些消息没有显示在任何其他浏览器中。

TypeError: 'null' is not an object

绕过这个网站,我看到有关jQuery绑定工作和Mobile Safari以及哪些不兼容的报告存在冲突。所以我决定建立自己的实验。

使用单个链接创建页面:

<a class="mylink">CLICK ME</a>

然后我尝试了这些绑定中的每一个:

$("a.mylink").click(function () { console.log("click worked"); });
$("a.mylink").bind("click", function () { console.log("bind worked"); });
$("a.mylink").live("click", function () { console.log("live worked"); });
$("a.mylink").on("click", function () { console.log("on worked"); });

我在控制台中得到任何响应的唯一一个是.live()。即便如此,它也非常不一致,通常会通过点击来发送垃圾邮件。

如果我编辑链接并添加一个onclick属性,如下所示:

<a onclick="function(){}" class="mylink">CLICK ME</a>

然后.live()一致地工作,但是还没有其他绑定。这对我来说似乎很疯狂,因为很多应用程序在Mobile Safari上运行就好了。有什么明显的东西我在这里不见了吗?

注意,我知道如何在任何人问之前使用jQuery,我的绑定是在$(document).ready()内部。
另外,我知道一旦href附加到链接就可以正常工作,但这显然不是我需要的,因为这是一个单页导航应用程序,并且附加一个href似乎完全忽略iOS中的任何绑定并导致完整页面导航。

2 个答案:

答案 0 :(得分:10)

您必须添加href="#"或将cursor:pointer添加到要点击的元素中。

这是一个测试(在iPad 3中):http://jsfiddle.net/dZqyU/2/

<a class="clickable">I have no href :( (I dont work in iPad)</a>
<br/>
<br/>
<a class="clickable" href="#">I have href :) (I work in iPad)</a>
<br/>
<br/>
<a class="clickable cursor">I have cursor, no href :) (I work in iPad)</a>

$(document).on('click','.clickable',function(){
    alert($(this).text() + 'and the binding worked :)');
});

.cursor{
cursor:pointer;
}

我猜这个问题就像a没有href属性的锚标记一样,并未被某些iOS Safari版本标识为可点击元素。但是,如果我们通过添加clickable或添加游标href明确地生成它们pointer,那么它就有效。 Here is a related link

答案 1 :(得分:1)

之前的回答是错误的。我进行了测试,并且能够在没有内联javascript的情况下实现您想要实现的功能,仅在iPhone上使用绑定。我的猜测是你在某个地方有一些小错字,并且由于jQuery的优雅降级的神奇能力,没有错误被调用。

你可以尝试一件事,假设我所说的错误不正确,就是将href =“#”添加到你的锚点,然后使用event.preventDefault()[你可能还需要添加event.stopImmediatePropagation()]代码。

很可能你的代码中存在一个错误(可能是某个地方完全不同,并且无关),桌面Safari很容易为你弄清楚,忽视或修复,但移动版Safari在我的经历。