J'ai trouvé deux solutions pour l'instant à ce problème, les deux utilisant évidemment preventDefault
sur les liens externes.
Si vous créez un lien vers un autre site Web ou vers quelque chose à télécharger, la seule option que je vois est d'avertir ironiquement l'utilisateur de maintenir son doigt sur le lien pour obtenir l'invite d'appel tactile. Ou encore, selon qu'il s'agit d'un site Web ou d'un PDF, lui demander de copier le lien ou, dans le cas d'un PDF, de l'ajouter à sa liste de lecture. Comme les modales d'alerte et de confirmation ne fonctionnent pas non plus, vous devrez mettre en place vos propres notifications modales. Si c'est déjà le cas, cela ne devrait pas poser trop de problèmes.
Mise à jour [2013-10-25] Apparemment, le problème a été corrigé dans iOS 7.0.3 et les liens s'ouvrent dans Safari...
Modifier [2013-10-05] Voici à peu près ce que j'utilise avec une modale jQuery UI.
// iOS 7 external link polyfill
$('a[rel=external], a[rel=blank], a[target=_blank], a[href$=".pdf"]').on('click', function(e) {
if (navigator.standalone && /iP(hone|od|ad) OS 7/.test(navigator.userAgent)) {
e.preventDefault(); e.stopPropagation();
var href = $(this).attr('href');
var $dialog = $('<div id="ios-copy"></div>')
.html('<p>iOS 7 prevents us from opening external links in Safari, you can continue to the address and risk losing all navigation or you can copy the address to your clipboard by <strong>holding your finger on the link</strong> for a few seconds.</p><p><a style="background-color: rgba(0,0,0,.75); color: #fff; font-size: 1.25em; padding: 1em;" href="' + href + '">' + href + '</a></p>')
.appendTo('body')
.dialog({
title: 'External link',
modal: true,
buttons: {
Ok: function() {
$( this ).dialog( "close" );
}
}
});
}
});
L'autre solution consiste à utiliser ajax ou une iframe pour charger le contenu externe, mais à moins que vous ne disposiez d'un bon sous-navigateur ou de quelque chose d'autre dans votre application, cela ne sera pas très convaincant. Voici quelque chose qui va dans ce sens.
// iOS 7 external link polyfill
if (/iP(hone|od|ad) OS 7/.test(navigator.userAgent) && window.navigator.standalone) {
$('a[rel=external], a[href$=".pdf"]').on('click', function(e) {
e.preventDefault(); e.stopPropagation();
var link = this;
var href = $(link).attr('href');
var frameContainer = $('<div></div>').css({
position: 'absolute',
left: 10,
top: $(link).position().top,
opacity: 0,
overflow: 'scroll',
'-webkit-overflow-scrolling': 'touch',
height: 520,
transition: 'opacity .25s',
width: 300
});
var iosFrame = $('<iframe class="iosFrame" seamless="seamless" width="1024" height="5000"></iframe>')
.attr('src', href)
.css({
height: 5000,
'max-width': 1024,
width: 1024,
overflow: 'scroll !important',
'-webkit-overflow-scrolling': 'touch !important'
});
var iosFrameClose = $('<a href="#"><i class="icon-cancel icon-remove icon-3x"></i></a>').css({
position: 'absolute',
left: -10,
top: $(link).position().top - 20,
'text-shadow': '1px 1px 1px #000',
transition: 'opacity .25s',
opacity: 0,
'-webkit-transform': 'translate3d(0, 0, 0)',
width: '3em',
height: '3em'
}).on('click', function(e) {
e.preventDefault();
setTimeout( function() {
$(frameContainer).remove();
$(iosFrameClose).remove();
}, 250);
});
iosFrame.appendTo(frameContainer);
frameContainer.appendTo('body');
iosFrameClose.appendTo('body');
iosFrame.contents().css({
'-webkit-transform': 'translate3d(0, 0, 0)'
});
// Show this thing
setTimeout( function() {
$(frameContainer).css({ opacity: 1 });
$(iosFrameClose).css({ opacity: 1 });
}, 1);
});
}