使用Cordova在iOS 8.4.1上链接(和点击)无法打开。

12

最新的iOS版本(8.4.1)似乎破坏了我们的ngCordova应用程序。

我们的链接通常无法打开,无论是直接使用href、ng-click还是ng-href访问。一些链接经过反复点击后才能打开,而且如果我们长时间点击它们,href会弹出一个弹出菜单,让我们选择“打开”、“复制”或“取消”。

这个问题在按钮或标签之间没有区别。有些a标签似乎运行良好。

我们之前使用较旧版本的cordova和ngcordova,但更新它们并没有解决这个问题。

我也尝试禁用用户选择,但没有解决问题。

这个问题只会在设备上发生,不会在模拟器中出现。

我们使用angular-mobile-ui指令toggleable来设置侧边栏菜单,并且当在侧边栏菜单中点击链接时,toggle事件会被触发,但链接不会重定向。

13个回答

5
另一种方法是像这样设置CSS属性(对我有效):
button:active { opacity: 1 !important; }

有个我无法理解的非常愚蠢的事情,但我认为它与苹果有关。具体内容请参见:https://support.apple.com/en-us/HT205030

影响:恶意网站可以使轻敲事件在另一个页面产生合成点击事件。 描述:在从轻敲事件生成合成点击事件的方式上存在问题,会导致点击目标指向其他页面。通过限制点击传播来解决了这个问题。

因此,我想如果活动状态下的按钮透明度低于1,苹果应该认为这是一个合成点击事件。


1
这个修复方法对我有效。我更新了fastclick库,但没有任何效果,但将按钮的不透明度设置为1.0就可以了。 - atc

4
我遇到了同样的问题。在这里查看苹果的安全更改日志:https://support.apple.com/en-us/HT205030 影响:恶意网站可以使触摸事件在其他页面上产生合成点击。
描述:存在一个问题,即如何从触摸事件中生成合成点击,可能会导致点击目标其他页面。该问题通过限制点击传播来解决。
我认为这个问题源于这个更改。
你可以将touchstart事件添加到你的click事件中。这暂时解决了我的问题,直到我找到更好的解决方案。
$('button').on('click touchstart', function(){
    // Click event
});

我们也遇到了同样的问题——fastclick为我们解决了它。 - GeneralBear

3

我使用最新版本的FastClick解决了这个问题。


2

我通过安装fastclick库成功解决了这个问题。FastClick


1
我们的一个应用程序也受到了FastClick 0.6.11的影响,但是通过使用最新版本的FastClick已经解决了这个问题。 - Nicolas R

1

你是否正在使用FastClick库?可以尝试升级到最新版本吗?

我们在iOS 8.4.1和FastClick 0.6.7版本上遇到了同样的问题。当我们升级到FastClick库的最新版本时,问题得到解决。不确定它为什么有效,但是对我们起作用了!


1

我也遇到了Cordova 4.1.2和iOS 8.4.1的同样问题,我通过更新FastClick解决了这个问题。


0

我可以亲自保证Fastlink在我们运行于Backbone/Marionette的应用程序中解决了这个问题。我们实施了它,我们的JavaScript点击事件再次按预期工作,而且无需从点击更改为任何触摸方法。我知道这也影响CSS下拉菜单(我们的应用程序没有),有人可以证明上述CSS hack解决了这个问题吗?


0

我尝试了以上所有的解决方案:

- opacity:1; = 没有影响
- FastClick = 比不起作用还糟糕(激活了CSS子菜单下隐藏的链接)
- 我使用touchStart事件创建了一个奇怪的解决方法,但这不是一个好的永久解决方案。我也将测试上面提到的短touchStart解决方案,但我的网站非常轻量级,甚至没有使用JQuery,所以我必须重新编写它。
- Fastlink = 我不知道在哪里获取这个JS

我的菜单是一个简单的CSS-only子菜单..没有任何Javascript。直到现在,因为苹果显然要求这样做!(而且关闭JS的人无法再浏览网站。)

但即使使用JS,我仍然没有找到一个好的解决方案来解决苹果所创建的全局网站破坏问题!

更多关于此主题的讨论,请参见Apple社区中的此帖子:https://discussions.apple.com/message/28790737


尝试了这个:a:active { opacity: 1 !important; } - RickSF
这样做可以实现功能,但是只适用于pureCSSmenu: var lastTouch; function touchStart(event){ var currentElement = event.target; if(currentElement.parentElement.nodeName == 'LI' && currentElement.className != 'pureCssMenui0') { location.href=currentElement.href; } if(currentElement.tagName == 'A' && currentElement.className == 'pureCssMenui0'){ event.preventDefault(); if(currentElement.href != lastTouch) { lastTouch = currentElement.href; } else { location.href=currentElement.href; } } } this.addEventListener("touchstart", touchStart, false); - RickSF

0

0

我在使用cordova 3.5版本构建ios项目时遇到了同样的问题。 当我将cordova更新到最新版本(5.1.1)并重新构建项目时,问题得到了解决。

我不确定这是否是根本原因,但对我来说它运行良好。

附:我的项目使用angularjs和cordova。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接