我正在开发一个可以在离线模式下使用移动版Safari的网站。我可以将它标记到主屏幕并从那里加载它。但是,一旦从主屏幕打开,点击某些链接将跳出应用程序并在移动游猎中打开 - 尽管我在所有链接点击上都阻止了默认()!
该应用程序绑定<body>
级别的onclick事件处理程序。使用事件委派,它捕获任何链接上的任何点击,查看其href(例如'help'或'review'),并动态调用javascript模板并更新页面。事件处理程序在事件对象上调用preventDefault() - 对于某些这样的链接,并使用模板输出更新页面。但是,对于在输出模板结果之前导致对本地数据库命中的链接,链接将在移动safari中打开。
在桌面游戏中,即使我处于离线状态,所有链接都能正常工作 - 这种情况正在发生,这是特定的移动游猎。
有关为什么某些链接可以脱机工作而不是其他链接的任何想法?清单文件中没有列出所讨论的链接URL,但由于阻止了链接操作,因此它们不应该(不应该)。
一些额外的奇怪之处: *一旦我点击一个加载在移动版Safari中的链接,即使我离线,这些相同的链接现在也可以工作,并且填充了数据库中的数据的模板可以正常工作。换句话说:从主屏幕打开时链接失败,但离线移动safari中没有 *更改链接以删除数据库命中(使用模拟数据库结果填充模板)解决了问题,并且可以在主屏幕中点击应用程序中的链接。
答案 0 :(得分:5)
您可能需要查看此内容:https://gist.github.com/1042026
// by https://github.com/irae
(function(document,navigator,standalone) {
// prevents links from apps from oppening in mobile safari
// this javascript must be the first script in your <head>
if ((standalone in navigator) && navigator[standalone]) {
var curnode, location=document.location, stop=/^(a|html)$/i;
document.addEventListener('click', function(e) {
curnode=e.target;
while (!(stop).test(curnode.nodeName)) {
curnode=curnode.parentNode;
}
// Condidions to do this only on links to your own app
// if you want all links, use if('href' in curnode) instead.
if('href' in curnode && ( curnode.href.indexOf('http') || ~curnode.href.indexOf(location.host) ) ) {
e.preventDefault();
location.href = curnode.href;
}
},false);
}
})(document,window.navigator,'standalone');
答案 1 :(得分:2)
我让它工作,问题是由于事件处理程序代码中的一个看不见的错误(与停止跟踪链接无关)。如果将click事件的事件处理程序绑定到body标记,并调用preventDefault(),则不会遵循链接并且不会打开mobile safari,您可以根据该链接url定义自己的逻辑来更新页面。
你应该确定在可能发生任何错误之前调用preventDefault() - 在我的情况下问题是在调用preventDefault()之前事件处理程序中发生了错误,但当然我看不到控制台中的错误,因为链接已被跟踪。
这是我正在使用的代码(它假定DOM标准事件并且在IE中会失败):
bodyOnClickHandler = function(e) {
var target = e.target;
if (target.tagName == 'A') {
e.preventDefault();
var targetUrl = target.getAttribute("href");
//show the page for targetUrl
}
}