2013-03-18 6 views
2

Je commence à travailler avec des applications web hors ligne. J'ai une petite application de test qui fait un abm simple avec localstorage quand est hors ligne, mon idée est que quand il est en ligne l'application utilise php comme backend language et pour synchroniser localstorage et php lorsque la connexion revient. Maintenant, les fonctions utilisées pour enregistrer des données sur localstorage sont différentes de celles utilisées pour envoyer des données à php.Supprimer le fichier JS et inclure un autre

Est-il possible de décharger de façon dynamique un fichier JS (appelons-le offline.js) et de charger un autre fichier (online.js)?

Ou sorcière serait une meilleure approche? Devrais-je inclure toutes les fonctions dans un fichier et changer les auditeurs de façon désinvolte?

+6

Vous ne pouvez pas décharger javascript.Gardez vos fonctions à l'intérieur des objets et permutez les objets à la place. – Dave

Répondre

3

Vous devriez avoir Function Wrapper avec démarrage IF Condition de vérification si le navigateur est en ligne.

ex:

function SaveData(data){ 
    if(BrowserIsOnline) 
     SaveDataToPHPServer(data); 
    else 
     SaveDataToLocalStorage(data); 

et gérer chaque corps de fonction différente.

1

Dans les navigateurs modernes, vous pouvez utiliser navigator.onLine pour vérifier la connexion. Voici les spécifications: http://www.w3.org/TR/offline-webapps/

var connection = navigator.onLine; 

if(connection){ 
    //Do AJAX 
}else{ 
    //Do Local Storage. 
} 
2

Vous ne pouvez pas décharger fichier javascript. Une fois chargé, il sera toujours chargé. Vous devrez probablement repenser votre conception un peu.

0

Voici une solution qui peut vous être utile ...

Avoir un espace de noms de fonction où toute votre logique réside, comme:

this.fn = {}; 
this.fn['save'] = function() {}; 
this.fn['load'] = function() {}; 

Et quand vos événements sont congédiés, il vous suffit utiliser la fonction appropriée comme dans:

var fn = this.fn['load']; 

ou

var fn = this.fn['save']; 

Ensuite, utilisez 'fn' comme vous le feriez normalement.

Vous pouvez même séparer vos fonctions par des modules, tels que 'online.js' et 'offline.js' où chaque module aurait les mêmes noms de fonctions, mais lié à son propre espace de noms.

Lorsque vient le temps de rétablir le lien entre les fonctions, vous pouvez simplement faire quelque chose comme:

this.fn['load'] = offlineModule.fn['load']; 

Si vous avez un nom pour toutes vos fonctions (par exemple: « charge », « sauver »), vous pouvez il suffit de l'avoir en boucle. Ce qui précède évite toutes les branches de condition 'if/else' qui peuvent parfois devenir ennuyantes et qui tentent d'utiliser un type de motif. Mais bonne question, parce que je commence une phase de planification pour un projet et j'aurai besoin de quelque chose de similaire à ce que vous décrivez dans votre question ... jusqu'à présent, c'est la meilleure solution pour cela. Essentiellement inspiré par la liaison dynamique de SO sous Linux (sorte de).

Questions connexes