Запретить автономное открытие веб-приложения для iphone в Safari - PullRequest
3 голосов
/ 19 декабря 2009

Я занимаюсь разработкой веб-сайта, который будет работать с мобильным сафари в автономном режиме. Я могу добавить его на домашний экран и загрузить его оттуда. Но после открытия с главного экрана нажатие на определенные ссылки выскочит из приложения и откроется в мобильном сафари - несмотря на то, что я предотвращаю функцию Default () при каждом нажатии ссылки!

Приложение связывает обработчик событий onclick на уровне <body>. Используя делегирование событий, он улавливает любой щелчок по любой ссылке, просматривает его ссылку (например, «помощь» или «обзор») и динамически вызывает шаблон javascript и обновляет страницы. Обработчик события вызывает функцию warnDefault () для объекта события - для некоторых ссылок это работает, и страница обновляется с помощью вывода шаблона. Однако для ссылок, которые приводят к попаданию в локальную базу данных перед выводом результатов шаблона, ссылки открываются в мобильном сафари.

В настольном сафари все ссылки работают, даже когда я не в сети - что-то происходит в зависимости от мобильного сафари.

Есть мысли о том, почему некоторые ссылки будут работать в автономном режиме, а другие нет? Ни один из рассматриваемых URL-адресов ссылок не указан в файле манифеста, но они не должны (не должны) указываться, так как действие ссылки предотвращено.

пара лишних странностей: * когда я нажимаю на ссылку, которая загружается в мобильном сафари, даже если я не в сети, те же самые ссылки теперь работают, и шаблоны, заполненные данными из базы данных, работают должным образом. другими словами: ссылки не открываются при открытии с домашнего экрана, но не из мобильного сафари в автономном режиме * изменение ссылки для удаления попадания в базу данных (заполнение шаблона с помощью результата фиктивной базы данных) решает проблему, и ссылки можно щелкать в приложении с главного экрана.

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

Вы можете взглянуть на это: 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');
2 голосов
/ 17 января 2010

Я заставил его работать, проблема была из-за невидимой ошибки в коде обработчика событий (не связанной с остановкой ссылки). Если вы связываете обработчик событий для событий click с тегом body и вызываете warnDefault (), ссылка не будет использоваться, и мобильное сафари не будет открыто, и вы можете определить собственную логику для обновления страницы на основе этого URL-адреса ссылки. ,

Вы должны быть уверены, что вызываете protectDefault () до того, как возможны какие-либо ошибки - проблема в моем случае заключалась в том, что в обработчике событий возникала ошибка до вызова метода protectDefault (), но, конечно, я не мог видеть эта ошибка в консоли, потому что ссылка уже была пройдена.

Вот код, который я использую (он предполагает стандартные события 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...