SELFHTML

Hatto von Hatzfeld:
Passation de valeurs JavaScript entre différents documents HTML

Page d'information: vue d'ensemble

vers le bas Hatto von Hatzfeld
vers le bas Le problème
vers le bas Apport de solution
vers le bas Solution clés en main
vers le bas Synthèse

Bas de la page 

Hatto von Hatzfeld

Adresse électronique: Adresse électronique hatzfeld@donbosco.de
Présence Internet:
(utilitaires JavaScript)
Page en langue allemande www.hattos-seiten.de

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!

vers le hautvers le bas 

Le problème

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 Page d'information: connexion exigée 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 Page d'information: connexion exigée 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 Page d'information: connexion exigée 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 Adresse électronique Thomas Fischer (Université de Kassel - voir son Page en langue allemande article de forum du 12.3.99 chez Page en langue allemande de.comp.lang.javascript) et qui contourne les difficultés déjà citées.

vers le hautvers le bas 

Apport de solution

L' Page d'information: connexion exigée objet window connaît la propriété Page d'information: connexion exigée 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.

Exemple d'affichage (nouvelle fenêtre) Exemple d'affichage: aperçu

Exemple - le document d'appel

<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">

Exemple - l'évaluation dans le document appelé

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>");

Explication:

Dans le premier document, après que Page d'information: connexion exigée 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.

vers le hautvers le bas 

Solution clés en main

Un problème posé par Page d'information: connexion exigée 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.

Exemple d'affichage (nouvelle fenêtre) Exemple d'affichage: aperçu

Script pour sauvegarder des textes au choix:

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;
}

Explication:

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 Page d'information: connexion exigée 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 Page d'information: connexion exigée replace. (Remarque: En juin 1999 et sur la base d'une proposition de Adresse électronique 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.

vers le hautvers le bas 

Synthèse

Avec l'utilisation présentée ici de Page d'information: connexion exigée 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 Page d'information: connexion exigée target) sont rendus délicats sinon impossibles, vu qu'elle a été renommée.

vers le haut

© 2001-2005 Seite Informations