J'ai eu de la chance avec les applications hors ligne mises en cache jusqu'à ce que j'essaie d'inclure des données provenant des points de terminaison JSONP. Voici un petit exemple, qui charge un seul film de la nouvelle API widget Netflix:Comment éviter que les retours JSONP soient mis en cache dans une application hors ligne HTML5?
<!DOCTYPE html>
<html manifest="main.manifest">
<head>
<title>Testing!</title>
</head>
<body>
<p>Attempting to recover a title from Netflix now...</p>
<script type="text/javascript">
function ping(r) { alert('API reply: ' + r.catalog_title.title.regular); }
var cb = new Date().getTime();
var s = document.createElement('SCRIPT');
s.src = 'http://movi.es/7Soq?v=2.0&output=json&expand=widget&callback=ping&cacheBuster=' + cb;
alert('SCRIPT src: ' + s.src);
s.type = 'text/javascript';
document.getElementsByTagName('BODY')[0].appendChild(s);
</script>
</body>
</html>
... et voici le contenu de mon manifeste, main.manifest
, qui ne contient pas de fichiers et est seulement là donc mon navigateur sait mettre en cache le fichier HTML appelant.
CACHE MANIFEST
Oui, je l'ai confirmé que mon serveur envoie le manifeste vers le bas avec le type de contenu correct, text/cache-manifest
. L'application fonctionne correctement - ce qui signifie que les deux alertes s'affichent - la première fois que je l'exécute, mais les exécutions suivantes, même avec la tentative de mise en cache dans la ligne 10, semblent essayer de charger le script à partir du cache. Peu importe ce que la chaîne de requête est. Je vois l'alerte montrant la source du script, mais le rappel ne se déclenche jamais.
Si je supprime le lien manifeste de la ligne 2 et réinitialise mon navigateur - étant Safari et le simulateur iPhone - pour vider le cache, il fonctionne à chaque fois. J'ai également essayé d'alerter le nombre de balises SCRIPT dans la page, et il voit définitivement à la fois la balise existante et la balise créée dynamiquement dans tous les cas.