防止离线iphone webapp在Safari中打开链接

时间:2009-12-19 17:30:16

标签: safari web-applications offline offline-mode offline-caching

我正在开发一个可以在离线模式下使用移动版Safari的网站。我可以将它标记到主屏幕并从那里加载它。但是,一旦从主屏幕打开,点击某些链接将跳出应用程序并在移动游猎中打开 - 尽管我在所有链接点击上都阻止了默认()!

该应用程序绑定<body>级别的onclick事件处理程序。使用事件委派,它捕获任何链接上的任何点击,查看其href(例如'help'或'review'),并动态调用javascript模板并更新页面。事件处理程序在事件对象上调用preventDefault() - 对于某些这样的链接,并使用模板输出更新页面。但是,对于在输出模板结果之前导致对本地数据库命中的链接,链接将在移动safari中打开。

在桌面游戏中,即使我处于离线状态,所有链接都能正常工作 - 这种情况正在发生,这是特定的移动游猎。

有关为什么某些链接可以脱机工作而不是其他链接的任何想法?清单文件中没有列出所讨论的链接URL,但由于阻止了链接操作,因此它们不应该(不应该)。

一些额外的奇怪之处: *一旦我点击一个加载在移动版Safari中的链接,即使我离线,这些相同的链接现在也可以工作,并且填充了数据库中的数据的模板可以正常工作。换句话说:从主屏幕打开时链接失败,但离线移动safari中没有 *更改链接以删除数据库命中(使用模拟数据库结果填充模板)解决了问题,并且可以在主屏幕中点击应用程序中的链接。

2 个答案:

答案 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
    }
}