Abspeichern eines Strings in window.name

Eine Lösung für das Problem, einen Wert (z.B. den Inhalt einer JS-Variablen) von einer HTML-Seite an eine später aufgerufene zu übergeben, liegt in window.name. Hier läßt sich auch ein längerer Text abspeichern (das wurde sogar mit 200 kB erfolgreich getestet; es ist jedoch wohl nicht zu empfehlen, im praktischen Betrieb mehr als einige Kilobytes zu nehmen). Thomas Fischer (Uni Kassel) hat diese tolle Entdeckung gemacht.
Eine Schwierigkeit liegt jedoch darin, daß die Netscape-Browser als window.name nur Zeichenketten zulassen, die nichts außer Buchstaben, Ziffern und dem Unterstrich _ enthalten (Umlaute, Satzzeichen und auch Leerzeichen sind nicht zulässig). Hier werden nun Funktionen vorgestellt, die eine entsprechende Umwandlung jeder beliebigen Zeichenkette durchführen.
Ein weiteres Problem liegt in einem Bug, der in bestimmten Versionen des MSIE 5.x (insbesondere MSIE 5.5) auftritt und zwar nur in Browserfenstern, die bei ihrer Öffnung einen Namen zugewiesen bekamen. Eine per onload im Body-Tag aufgerufene Funktion (sie darf keinesfalls schon vorher aufgerufen werden, wenn der Browser noch den Quellcode interpretiert!) prüft daher, ob der Bug auftritt, und öffnet gegebenenfalls ein neues, unbenanntes Fenster.
Sofort zum Test

Zunächst das Script:

 
spzzchn=  "*+-./_@"; // die Zeichen, die escape nicht umwandelt

// ein Ersatz für replace (was zu JS 1.2 gehört)
function ersetze(text,stxt,etxt) {
  var txt=text; var stl=stxt.length; var etl=etxt.length; var k=0;
  while (k<txt.length+1-stl) {
    var i = txt.indexOf(stxt,k); if (i<k) k=txt.length+2;
    else {
      txt = txt.substring(0,i) + etxt + txt.substring(i+stl,txt.length);
      k+=etl;
    }
  }
  return txt;
}

function WertSpeichern(eingabe) {
  var a=escape(eingabe);
  for(var i=0;i<spzzchn.length;i++)
    a=ersetze(a,spzzchn.charAt(i),"%X"+i);
  a=ersetze(a,"%","_");
  self.name=a;
}

function WertAusgeben() {
  var b=""+self.name;
  b=ersetze(b,"_","%");
  for(var i=0;i<spzzchn.length;i++)
    b=ersetze(b,"%X"+i,spzzchn.charAt(i));
  b=unescape(b);
  return b;
}

// Test auf MS-window.name-Bug
function winnamebugtest() {
  if(navigator.userAgent && navigator.userAgent.indexOf("MSIE")>0) {
    var altname=window.name;
    var neuname="X"+(new Date()).getTime();
    window.name=neuname;
    self.location.href="javascript:void(0)";
    if(window.name!=neuname) {
      alert("Ein Bug Ihres Browsers verhindert die dauerhafte Zuweisung\n"+
            "eines anderen Wertes an window.name, wenn das Fenster schon\n"+
            "beim Öffnen einen Namen erhalten hatte.\n\n"+
            "Daher wird jetzt ein neues, unbenanntes Fenster geöffnet.");
      window.open(self.location.href,"",
                  "status=1,location=1,menubar=1,resizable=1,toolbar=1,scrollbars=1");
      history.back();
      window.close();
    }
    else self.focus();
    window.name=altname;
  }
}

[...]

<body ... onload="winnamebugtest()">

Und nun der Test:

Abzuspeichernder Wert: (bitte irgendetwas eingeben)


Inhalt von window.name nach dem Abspeichern:


Ausgelesener Wert:

Um zu testen, ob der Wert wirklich übergeben wird, bitte die Seite "Wert anzeigen" aufrufen!


Diese Seite wurde erstellt von H. v. Hatzfeld
weitere kleine Programme: http://www.salesianer.de/util/
Anmerkungen, Fragen, Fehlermeldungen bitte an hatzfeld@salesianer.de