![]() |
Hatto von Hatzfeld: |
|
|
|
| Adresse électronique: |
|
|
Présence Internet: (utilitaires JavaScript) |
|
Cet article a été revu et corrigé le 20/06/1999.
Il s'agit ici d'un article traduit de l'allemand par la rédaction de SELFHTML actuel. Veuillez poser vos questions relatives à cet article uniquement à son auteur, prenant compte que celui-ci ne maîtrise peut-être pas la langue française!
Il arrive souvent que des programmeurs en JavaScript désirent rendre des variables, qui ont été définies dans un document, également disponibles par la suite dans un autre document qui sera chargé dans la même fenêtre du navigateur. Cela peut être très utile pour remplir un formulaire étendu sur plusieurs pages.
Il n'est pas rare que l'on utilise à cet effet des
témoins de connexion (Cookies). Ceux-ci peuvent cependant être un "Overkill", quand il ne s'agit pas de conserver des données entre différentes sessions, mais de les sauvegarder au cours de la même session.
De plus, de nombreux utilisateurs ont désactivé l'utilisation de témoins de connexion ou ne veulent les accepter qu'après confirmation pour chacun d'entre eux.
Une autre possibilité est l'utilisation de
cadres, étant donné que que là, lorsque le contenu des cadres change, le jeu de cadres lui-même y compris ses variables JavaScript est conservé. Cependant, l'utilisation de cadres n'est pas toujours appropriée ni souhaitée.
La plupart du temps, il était proposé jusqu'alors comme solution de raccrocher les données souhaitées à l'adresse URL - par exemple avec un point d'interrogation qui les précède - et de les faire évaluer à l'aide de
window.location.search par le script du document appelé.
Cette solution présente cependant divers inconvénients, celui entre autres qu'une copie, se trouvant éventuellement déjà dans un cache, ne soit pas utilisée (temps d'attente inutile et transfert de données superflu), ou bien alors le fait que certains navigateurs ne permettent pas une utilisation hors connexion.
Ici sera présentée une autre solution dont les principes ont été découverts par
Thomas Fischer (Université de Kassel - voir son
article de forum du 12.3.99 chez
de.comp.lang.javascript) et qui contourne les difficultés déjà citées.
L'
objet window connaît la propriété
name. Elle reste en mémoire pendant troute la "durées de vie" de la fenêtre du navigateur, et peut cependant être modifiée par une instruction JavaScript (exception faite de Netscape 2.0).
Ainsi se présente l'opportunité d'utiliser cette propriété pour la sauvegarde de données ayant à être conservées après un changement du contenu de la fenêtre. Même le problème typique à Netscape de la perte de variables JavaScript après une modification de la taille de la fenêtre du navigateur peut être ainsi résolu.
<script language="JavaScript">
function appel(selObj) {
self.name=selectvaleur(selObj);
self.location.href="passval1a.htm";
}
function selectvaleur(sObj) {
return sObj.options[sObj.selectedIndex].value;
}
</script>
<form name="eform" onSubmit="appel(document.eform.nombre);return false">
<p>Combien d'adresses électroniques avez-vous?</p>
<p>Nombre:
<select name="nombre" size="">
<option value="1">1
<option value="2">2
<option value="3">3
<option value="4">4
<option value="5">5
</select><br>
<input type=submit value="Suite">
|
var nombre=parseInt(window.name);
document.write("<p>Mentionnez ici vos " + nombre +
" adresse(s) électronique(s) :\n");
for(var i=0;i<nombre;i++)
document.write("<br>Adresse N° " + (i + 1) +
"<input type=\"Text\" name=\"Adresse" + i +
"\" size=\"20\" maxlength=\"30\">\n");
document.write("<br><input type=\"submit\" value=\" Suite \"></p>");
|
Dans le premier document, après que
onSubmit a été lancé grâce à la fonction selectvaleur(...), un champ de formulaire est évalué et sa valeur est placée dans self.name . Ensuite en l'affectant à self.location.href, le document suivant est chargé.
Le deuxième document lit cette valeur et l'utilise afin de créer dynamiquement le code HTML pour un nombre variable de champs de saisie.
Un problème posé par
window.name est qu'ici, seuls les lettres, les chiffres et le tiret de soulignement _ sont autorisés (l'Explorer Internet MS accepte cependant d'autres signes).
Ainsi pour la sauvegarde de chaînes de caractères de votre choix, les signes non autorisés doivent d'abord être convertis.
Le script suivant met pour ce faire des fonctions à disposition.
signsp= "*+-./_@";
function remplace(text,find,repl){
var found = text.indexOf(find);
var retVal= ""; var start = 0;
while(found != -1){
retVal +=text.substring(start,found) +repl;
start = found+find.length;
found =text.indexOf(find,start);
}
retVal +=text.substring(start,text.length);
return retVal;
}
function sauvevaleur(entree) {
var a=escape(entree);
for(var i=0;i<signsp.length;i++)
a=remplace(a,signsp.charAt(i),"%X"+i);
a=remplace(a,"%","_");
self.name=a;
}
function sortvaleur() {
var b=""+self.name;
b=remplace(b,"_","%");
for(var i=0;i<signsp.length;i++)
b=remplace(b,"%X"+i,signsp.charAt(i));
b=unescape(b);
return b;
}
|
Par l'appel de la fonction sauvevaleur(...) un texte au choix peut être sauvegardé; la fonction sortvaleur() restitue ensuite cette valeur.
Étant donné que la fonction
escape ne transforme pas les signes nommés contenus dans signsp, ces signes sont remplacés par les codes Escape correspondants dans la fonction sauvevaleur(...).
Suite à quoi tous les signes % sont remplacés par des signes _. Ainsi, on est assuré que seuls des signes autorisés sont utilisés. La fonction sortvaleur() annule à nouveau ces transformations.
La fonction remplace(text,find,repl), prévue à cet effet, remplace dans la chaîne text toutes les occurrences de la chaîne recherchée find par une chaîne de substitution repl. Elle a été définie pour la bonne raison que les versions de JavaScript antérieures à la version 1.2 ne supportent pas l'utilisation de la méthode
replace. (Remarque: En juin 1999 et sur la base d'une proposition de
Thomas Fischer - personne différente du Thomas Fischer évoqué plus haut - j'ai redéfini la fonction. Maintenant, elle travaille sensiblement plus vite ce qui peut être déterminant pour des grandes quantités de données.
Avec l'utilisation présentée ici de
window.name, le programmeur en JavaScript trouve une possibilité relativement simple de mettre des données côté client à disposition de différents documents chargés l'un après l'autre.
Aucune limine de taille n'a pu être constatée par l'auteur; même une chaîne de caractères de plusieurs 100 Ko a été exploitée avec succès. Cependant, il est plutôt conseillé de ne pas dépasser quelques Ko dans une utilisation régulière. Quand on utilise des cadres ou plusieurs fenêtres du navigateur ouvertes simultanément, il faut néanmoins remarquer que les les accès à la fenêtre par son nom (comme par exemple par
target) sont rendus délicats sinon impossibles, vu qu'elle a été renommée.
|
|