iOS Safari, автономная навигация в веб-приложении, вдруг не работает
В iOS это отдельный режим работы с веб-приложением. Вы можете запретить открытие ссылки в Mobile Safari вместо открытия в самом веб-приложении:
(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 && // is a link
(chref=curnode.href).replace(location.href,'').indexOf('#') && // is not an anchor
( !(/^[a-z\+\.\-]+:/i).test(chref) || // either does not have a proper scheme (relative links)
chref.indexOf(location.protocol+'//'+location.host)===0 ) // or is in the same protocol and domain
) {
e.preventDefault();
location.href = curnode.href;
}
},false);
}
})(document,window.navigator,'standalone');
Это работает некоторое время, но после нового обновления Apple от iOS каждая ссылка открыта в Mobile Safari.
После отладки я обнаружил, что условия в коде все еще корректны, потому что в автономном режиме location.href = curnode.href;
все еще поражен / казнен.
Поэтому я думаю: изменение документа - это ссылка на страницу, по которой щелкнули по ссылке, больше не работает (более строгие правила или около того?)
Я попытался изменить путь вместо полного URL, выполнив:location.pathname = curnode.getAttribute('path');
(Думая, что если изменить только путь, возможно, веб-приложение останется в веб-приложении)
Есть ли кто-нибудь, кто сталкивается с этой проблемой, или кто-то, кто может помочь мне подумать в правильном направлении для решения или, лучше, но не так весело, найти решение?
1 ответ
Нашел решение. Вместо того, чтобы использовать location.href = curnode.href;
Я сейчас пользуюсь location.assign(curnode.href);