cookies
miss ratlos
- javascript
Hallo!
ich hab da ein (für mich, da newbie) rießen-problem und wäre wirklich sehr dankbar, wenn mir jemand von euch dabei helfen würde...
ich bin dabei eine art html-online-kurs für einen kunden aufzubauen. dieser ist aufgeteilt in verschiedene lerneinheiten auf die man von der 1. seite (index.htm) aus zugreifen kann. die verschiedenen lerneinheiten enthalten jeweils 10 verschiedene themengebiete.
jetzt mein problem: der kunde möchte dass der user beim erneuten aufrug des kurses eine meldung erhält die ihm sagt, bei welcher lerneinheit und bei welchem thema er das letzte mal stehengeblieben ist.
dazu habe ich mit javascript auf die verschiedenen themen-seiten cookies gesetzt. wenn ich dann eine lerneinheit aufrufe bekomme ich auch die meldung wo der user das letzte mal aufgehört hat. aber wenn ich die index.htm aufrufe, kommt die meldung "null" bzw. "undefined".
die verzeichnisstruktur ist übrigens so, dass die einzelnen lerneinheiten in eigenen verzeichnissen liegen. also:
index.htm (startseite)
verzeichnis 1
verzeichnis 2
usw...
wo könnte das problem liegen?
ich hab auch bereits das forum und selfhtml durchforstet aber leider nichts gefunden, das mir weiterhilft. deshalb "belästige" ich euch nun... sorry ;-)
hoffe, ich habe mein problem einigermaßen verständlich formuliert...
viele grüße und schon jetzt 1000 dank für eure hilfe!
miss ratlos
Hallo!
Hallo miss ratlos,
ob Cookies wirklich die beste Methode sind, lassen wir mal dahingestellt. Grundsätzlich funktioniert das Ganze schon. Wenn Du konkret wissen willst, warum es bei Dir nicht funktioniert, mußt Du konkret Deine Scrips oder Deinen HTML posten oder wenigstens einen Link, wo wir uns das mal ansehen können. Im SELFHTML Forum findest Du eine geballte Ladung Know-How-Träger, die Dir gerne helfen. Aber Hellseher ist keiner dabei.
Hruß
Hans-Peter
zuerst mal muss ich sagen dass ich auch finde, dass cookies nicht die beste lösung sind, aber mein chef und der kunde wollen das gerne so haben :-(
nen link auf das ganze kann bzw. darf ich nicht schicken. weil dieser kurs für eine akademie ist und die user eigentlich dafür zahlen müssen, damit sie den kurs machen dürfen ;-)
mein code sieht so aus (hab ich übrigens aus nem js-buch, da ich selber leider noch nicht allzuviel ahnung von js habe, deshalb bitte nicht lachen ;-))
ok, hier also der code mit dem ich die cookies setze:
function setzeCookie(name, wert) {
var arg_wert = setzeCookie.arguments;
var arg_laenge = setzeCookie.arguments.length;
var expires = (arg_laenge > 2) ? arg_wert[2] : null;
var path = (arg_laenge > 3) ? arg_wert[3] : null;
var domain = (arg_laenge > 4) ? arg_wert[4] : null;
var secure = (arg_laenge > 5) ? arg_wert[5] : false;
document.cookie = name + "=" + escape(wert) +
((expires == null) ? "" : ("; expires="
+ expires.toGMTString ()))
+ ((path == null) ? "" : ("; path=" + path))
+ ((domain == null) ? "" : ("; domain=" + domain))
+ ((secure == true) ? "; secure" : "");
}
setzeCookie("test", "Sie waren zuletzt bei der Lerneinheit Seitenstruktur - Thema Attribute");
und hier der code mit dem ich die cookies hole (der steht auf der index.htm):
function holeCookie(name) {
name += "=";
var laenge = name.length;
var cookie_laenge = document.cookie.length;
var i = 0;
while (i < cookie_laenge) {
var j = i + laenge;
if (document.cookie.substring(i, j) == name)
return holeCookieWert(j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0)
break;
}
return null;
}
function holeCookieWert(position) {
var ende = document.cookie.indexOf(";", position);
if (ende == -1)
ende = document.cookie.length;
return unescape(document.cookie.substring(position,ende));
}
if (document.cookie) {
alert(holeCookie("test"));
}
else {
alert("pfui");
}
und das ergebnis ist: wenn ich die index.htm aufrufe bekomme ich "pfui" und nicht den cookie :-(
hilft das weiter???
liebe grüße
miss ratlos
Hallo!
Hallo miss ratlos,
ob Cookies wirklich die beste Methode sind, lassen wir mal dahingestellt. Grundsätzlich funktioniert das Ganze schon. Wenn Du konkret wissen willst, warum es bei Dir nicht funktioniert, mußt Du konkret Deine Scrips oder Deinen HTML posten oder wenigstens einen Link, wo wir uns das mal ansehen können. Im SELFHTML Forum findest Du eine geballte Ladung Know-How-Träger, die Dir gerne helfen. Aber Hellseher ist keiner dabei.
Hruß
Hans-Peter
zuerst mal muss ich sagen dass ich auch finde, dass cookies nicht die beste lösung sind, aber mein chef und der kunde wollen das gerne so haben :-(
Ja, ja, so sind sie (die Chefs) hoffentlich ließt der kein SELFHTML.
nen link auf das ganze kann bzw. darf ich nicht schicken. weil dieser kurs für eine akademie ist und die user eigentlich dafür zahlen müssen, damit sie den kurs machen dürfen ;-)
Klar, das verstehe ich.
mein code sieht so aus (hab ich übrigens aus nem js-buch, da ich selber leider noch nicht allzuviel ahnung von js habe, deshalb bitte nicht lachen ;-))
Äh, nein. Wenn jemand das auf die Schnelle überblickt kann er des Rätsels Lösung gerne Posten. Ich komme erst heute Abend dazu. Was mir aber so spontan ins Auge springt (Autsch !) : _warum so umständlich_ ? Es geht auch _viel_ einfacher ...
... mit _einem einzigen_ Cookie (kein Script, nur Klartext):
Habe ich mich verständlich ausgedrückt ? Falls "nein" fragen, ich antworte heute Abend.
Grüßle
Hans-Peter
Hallo Hans-Peter!
zuerst einmal danke für deine hilfe!!
trotzdem muss ich zugeben, dass es schön wäre, wenn du das heute abend nochmal ein bisschen ausführlicher schreiben könntest ;-)
denk dran: ich bin totaler newbie und noch sehr leicht zu verwirren ;-)
jetzt schon ein großes DANKE!!!
miss ratlos
zuerst mal muss ich sagen dass ich auch finde, dass cookies nicht die beste lösung sind, aber mein chef und der kunde wollen das gerne so haben :-(
Ja, ja, so sind sie (die Chefs) hoffentlich ließt der kein SELFHTML.
nen link auf das ganze kann bzw. darf ich nicht schicken. weil dieser kurs für eine akademie ist und die user eigentlich dafür zahlen müssen, damit sie den kurs machen dürfen ;-)
Klar, das verstehe ich.
mein code sieht so aus (hab ich übrigens aus nem js-buch, da ich selber leider noch nicht allzuviel ahnung von js habe, deshalb bitte nicht lachen ;-))
Äh, nein. Wenn jemand das auf die Schnelle überblickt kann er des Rätsels Lösung gerne Posten. Ich komme erst heute Abend dazu. Was mir aber so spontan ins Auge springt (Autsch !) : _warum so umständlich_ ? Es geht auch _viel_ einfacher ...
... mit _einem einzigen_ Cookie (kein Script, nur Klartext):
- wenn DeinCookie nicht existiert DeinCookie (LetztesKapitel = 0) setzen
- wenn DeinCookie existiert, auf der jeweiligen Kapitelseite _ändern_
wenn DeinCookie(LetztesKapitel) < aktuelles Kapitel dann DeinCookie(LetztesKapitel = AktuellesKapitel) setzen. Ein entsprechender Text kann als zweiter Parameter mitgegeben werden.
Habe ich mich verständlich ausgedrückt ? Falls "nein" fragen, ich antworte heute Abend.
Grüßle
Hans-Peter
Hallo miss ratlos,
zunächst mal muß ich das "gaaanz einfach" doch noch mal revidieren. Im Prinzip ist es so schon richtig, ich hatte schon einen Schritt weiter gedacht, wo dieses Prinzip nicht mehr so gut funktioniert.
Aber der Reihe nach.
Mit JavaScript kann man Cookies nicht sooo sehr elegant handhaben. Deshalb geistern eine Reihe von Beispiel-Scrips im Internet herum, die im Prinzip alle das Gleichen machen. Deine Scripts sind soweit schon in Ordnung. Nicht in Ordnung sind folgende Sachen.
Erstens: Das Verfallsdatum. Jedes Cookie braucht explizit die Angabe eines Verfallsdatums. Andernfalls wird das Ende der Session (wenn der Besucher seinen Browser schließt) als Verfalls-Zeitpunkt angenommen und das Cookie is weg. Dein Script setzteCookie() ist (wenn auch etwas unübersichtlich) auf die Eingabe eines Verfallsdatum vorbereitet. In arg_laenge legt es die Anzahl der Argumente (der Übergabeparameter) ab. Das können mehr sein, als in der Parameterliste aufgeführt sind. Schreibe einfach als dritten Parameter in setzeCookie() ein Verfallsdatum rein (dazu später mehr).
Zweitens: Jede HTML-Datei hat Kenntnis von allen Cookies, die von Dateien aus dem gleichen oder einem höheren Verzeichnis gesetzt wurden. Dies bedeutet aber (im Umkehrschluß) dass das Cookie, das in einem untergeordneten Verzeichnis gesetzt wurde (nämlich in einer der Lektionen) in Deinem File index.htm nicht gelesen werden kann. Abhilfe schafft aber ebenfalls Dein Script setztCookie(), das _noch_ mehr Parameter verträgt, mindestens einen vierten, der den Pfad angiebt, ab dem das Cookie gelesen werden kann. Setzte diese Pfadangabe einfach auf das Root-Verzeichnis und Du bist diese Sorge los.
Drittens, sollte Dein Cookie in index.htm initialisiert werden, damit es einen definierten Wert beim ersten Aufruf von index.htm hat.
So !
Unter http://www.RiegerNet.de/MissRatlos findest Du eine Datei index.htm sowie die Dateien
Lektion_1/Lektion_1.htm
Lektion_2/Lektion_2.htm
Lektion_3/Lektion_3.htm
als eine funktionsfähige Mini-Version Deines Online-Kurses. Klick einfach mal zwischen "Lektion x" und "zurück" hin und her. Ich habe mich dabei auf das Elementarste beschränkt. Sehe Dir am Besten (mittels rechte Maustaste => Quelltext anzeigen) die entsprechenden Sourcen an.
Deine drei JavaScript-Funktionen habe ich (schweren Herzens) unverändert gelassen.
Mit einem onLoad-Event im Body-Tag von index.htm wird die Initialisierung des Cookies durchgeführt.
Mit einem onLoad-Event im Body-Tag der Lektion_x.htm Files wird das Update des Cookie durchgeführt.
Beides kannst Du natürlich machen, wo Du willst.
Das Verfalls-Datum (expire) wird in allen Dateien auf "heute plus 1 Jahr" gesetzt (dann müßten Euere Schüler HTML beherrschen ;-) ).
Der Pfad (path) wird auf "/" gesetzt (= Root-Directory).
Die JavaScripts sollte man zweckmäßigerweise in eine Datei auslagern und per Include einbinden.
Noch nicht gelöst ist der Umstand, das das System nun ein Gedächtnis für die _letzte_ Lektion hat, nicht aber für die _höchste_ Lektion. Aber das schaffst Du - denke ich mal - jetzt recht leicht.
Ciao
Hans-Peter
... jetzt habe ich aber was bei Dir gut :-) !
Hallo Hans-Peter!!!
vielen vielen Dank!!!! du hast mir wirklich ein ganzes stück weitergeholfen!!!
viele grüße von
miss schon-ein-bisschen-weniger-ratlos ;-)
... jetzt habe ich aber was bei Dir gut :-) !
Hallo Hans-Peter!
ist mir ja schon fast peinlich, aber vielleicht kannst du mir ja nochmal kurz helfen?
und zwar klappt es ja jetzt wunderbar, es wird eine meldung angezeigt die dem user sagt, wo er denn das letzte mal aufgehört hat. ABER: wie schaffe ich es dass, wenn der user auf "ok" drückt, diese seite auch angezeigt wird???
zur info: in jedem verzeichnis lerneinheit gibt es eine datei lerneinheit-frame.htm. die jeweilige themenseite wird dort in dem frame "content" angezeigt.
hier ist mein code in der index.htm:
if (document.cookie)
{
if (confirm(holeCookie("MeinCookie")) == true) {
window.location.href = ???;
}
else {
}
}
else
{
setzeCookie("MeinCookie", "Viel Spaß mit den Lektionen", expire, "/");
}
1000 dank schon mal!!!!
... jetzt habe ich aber was bei Dir gut :-) !
Hallo Hans-Peter!
Hallo miss ... (nein, das sag´ ich jetzt nicht mehr)
ist mir ja schon fast peinlich, aber vielleicht kannst du mir ja nochmal kurz helfen?
werds versuchen
und zwar klappt es ja jetzt wunderbar, es wird eine meldung angezeigt die dem user sagt, wo er denn das letzte mal aufgehört hat.
:-)
ABER:
8-(
wie schaffe ich es dass, wenn der user auf "ok" drückt, diese seite auch angezeigt wird???
zur info: in jedem verzeichnis lerneinheit gibt es eine datei lerneinheit-frame.htm. die jeweilige themenseite wird dort in dem frame "content" angezeigt.
Das ist einer der Punkte, derentwegen ich keine Cookies genommen hätte. Nicht weil Cookies a priori "böse wären, sondern weil da sicher noch was nachkommt. Aber seisdrum.
Wenn ich es richtig verstanen habe, dann gibt es da ein Problem an einer ganz anderen Ecke. Natürlich kannst Du eine beliebige Seite bzw. ein FrameSet (lerninhalt-frame.htm) aufrufen. Aber Du kannst nicht so ganz problemlos ein FrameSet aufrufen und (mehr oder weniger dynamisch) eine beliebigen Seite Thema-xyz.htm in einem Frame laden.
Siehe dazu:
http://selfaktuell.teamone.de/artikel/javascript/dyn-frames/index.htm#
Verstehst Du was ich meine ? So ein FrameSet ist von Haus aus eine ziemlich statische Angelegenheit (Art der Aufteilung, Größe der Frames und - leider - auch Inhalts-Dateien). Wenn man das ändern möchte, muß man zum richtigen Zeitpunkt die richtige Datei in das FrameSet nachladen. Sieh´ Dir mal obigen Artikel an. Wenns nicht klappt baue ich (leider erst wieder heute Abend) unter der bekannten URL was ein.
Auf die Schnelle (quick and dirty) könntest Du folgendes machen: Immer dann, wenn Du das Cookie mit einem neuen Text an den Besucher beschreibst, mache das gleiche mit zwei weiteren Cookies. Das erste neue Cookie kriegt den die URL des (nächsten Ziel-) FrameSets, das zweite neue Cookie die URL der (nächsten Ziel-) Themenseite (wenn schon Cookies, dann ordentlich).
Nach dem OK-Klick lädst Du (*.href .. wie beschrieben) das entsprechende FrameSet (aus dem Cookie 2), der Content-Frame des frisch geladenen FrameSets kriegt in seinem Body-Tag ein onLoad-Event mit einem *.href auf die Themenseite (aus dem Cookie 3).
Kommst Du damit klar ?
Ciao, bis bald
P.S.: Was mich die ganze Zeit wundert: Du machst doch einen HTML-Kurs, oder ? Laufen da nicht massenweise JavaScript-Experten in Eueren Gängen herum ?
Hi!
danke für die rasche antwort.
ich hab selbst auch ein bisschen rumgebastelt und das hier fabriziert:
auf der themenseite, wo das cookie gesetzt wird:
function updateCookie()
{
var oneYear = 365*24*60*60*1000;
var expire = new Date();
expire.setTime(expire.getTime() + oneYear);
setzeCookie("MeinCookie", "Bei der letzten Sitzung waren Sie bei
der \nLerneinheit Seitenstruktur - Thema Lernziele
stehengeblieben. \nMöchten Sie dort fortfahren? @lerneinheit1/sh-
lerneinheit-frame.htm?site=sh-lerneinheit-thema-1.htm",
expire, "/");
}
habe also den text des cookies erweitert.
auf die index hab ich dann folgendes geschrieben:
function funInitCookie ()
{
var oneYear = 365*24*60*60*1000;
var expire = new Date();
expire.setTime(expire.getTime() + oneYear);
if (document.cookie)
{
var cookie = holeCookie("MeinCookie");
var confirmText = cookie.substring(0,cookie.search(/@/));
var av = cookie.substring(cookie.search(/@/)+1,cookie.length);
if (confirm (confirmText) == true)
{
window.location.href = av;
}
else {
}
}
else
{
setzeCookie("MeinCookie", "Viel Spaß mit den Lektionen",
expire, "/");
}
}
ich sage also, dass er diesen cookie-string aufteilen soll und nur
den teil ab dem @-zeichen lesen soll.
das funktioniert auch ganz gut, soll heissen er springt auf das gewünschte frameset, lädt dann aber immer die erste seite themenseite der jeweiligen lerneinheit - auch wenn ich im cookie von thema 2 z.b. angebe: @lerneinheit1/sh-lerneinheit-frame.htm?site=sh-lerneinheit-thema-2.htm.
die lädt er nicht sondern immer nur thema 1.
da muss ich jetzt noch ein bisschen knobeln...
miss trotzdem-noch-ein-bisschen-ratlos ;-)
p.s. die meisten leute bei uns in der firma sind eher experten in php, cold fusion usw als in javascript. es gibt zwar schon welche die mir helfen könnten, nur haben die auch so viel zu tun, dass ich nicht fragen möchte. ausserdem bin ich erst seit 2 monaten in der firma und ich komm mir eh schon blöd vor, weil ich das ganze nicht sofort auf die reihe krieg....
Hallo Hans-Peter!
Hallo miss ... (nein, das sag´ ich jetzt nicht mehr)
ist mir ja schon fast peinlich, aber vielleicht kannst du mir ja nochmal kurz helfen?
werds versuchen
und zwar klappt es ja jetzt wunderbar, es wird eine meldung angezeigt die dem user sagt, wo er denn das letzte mal aufgehört hat.
:-)
ABER:
8-(
wie schaffe ich es dass, wenn der user auf "ok" drückt, diese seite auch angezeigt wird???
zur info: in jedem verzeichnis lerneinheit gibt es eine datei lerneinheit-frame.htm. die jeweilige themenseite wird dort in dem frame "content" angezeigt.
Das ist einer der Punkte, derentwegen ich keine Cookies genommen hätte. Nicht weil Cookies a priori "böse wären, sondern weil da sicher noch was nachkommt. Aber seisdrum.
Wenn ich es richtig verstanen habe, dann gibt es da ein Problem an einer ganz anderen Ecke. Natürlich kannst Du eine beliebige Seite bzw. ein FrameSet (lerninhalt-frame.htm) aufrufen. Aber Du kannst nicht so ganz problemlos ein FrameSet aufrufen und (mehr oder weniger dynamisch) eine beliebigen Seite Thema-xyz.htm in einem Frame laden.
Siehe dazu:
http://selfaktuell.teamone.de/artikel/javascript/dyn-frames/index.htm#
Verstehst Du was ich meine ? So ein FrameSet ist von Haus aus eine ziemlich statische Angelegenheit (Art der Aufteilung, Größe der Frames und - leider - auch Inhalts-Dateien). Wenn man das ändern möchte, muß man zum richtigen Zeitpunkt die richtige Datei in das FrameSet nachladen. Sieh´ Dir mal obigen Artikel an. Wenns nicht klappt baue ich (leider erst wieder heute Abend) unter der bekannten URL was ein.
Auf die Schnelle (quick and dirty) könntest Du folgendes machen: Immer dann, wenn Du das Cookie mit einem neuen Text an den Besucher beschreibst, mache das gleiche mit zwei weiteren Cookies. Das erste neue Cookie kriegt den die URL des (nächsten Ziel-) FrameSets, das zweite neue Cookie die URL der (nächsten Ziel-) Themenseite (wenn schon Cookies, dann ordentlich).
Nach dem OK-Klick lädst Du (*.href .. wie beschrieben) das entsprechende FrameSet (aus dem Cookie 2), der Content-Frame des frisch geladenen FrameSets kriegt in seinem Body-Tag ein onLoad-Event mit einem *.href auf die Themenseite (aus dem Cookie 3).
Kommst Du damit klar ?
Ciao, bis bald
P.S.: Was mich die ganze Zeit wundert: Du machst doch einen HTML-Kurs, oder ? Laufen da nicht massenweise JavaScript-Experten in Eueren Gängen herum ?
Hi,
hey, der Ansatz ist sehr gut. Und im Ziel-Frameset mußt Du nun "site" auswerten und dem Content-Frame als Inhalt zuordnen. Sehr schön. Du bist ja doch fit in JavaScript !
Geh, jetzt einfach der Reihe nach durch die Scripts durch und gebe mit alert() alle möglichen erwarteten Werte aus. Ich bin sicher, es hängt jetzt nur noch a einer Kleinigkeit (ein Leerzeichen zu viel oder ein Anführungsszeichen zu wenig, oder so).
Viel Erfolg
Hans-Peter
Moin, moin!
Wenn ich SELFHTML richtig gelesen habe, kann von einer Seite aus nur das Cookie gelesen werden, das von dieser Seite aus gesetzt wurde. Das Auslesen beliebiger Cookies von einer Startseite aus dürfte also nicht möglich sein:
Cookies ... bieten Ihnen die Möglichkeit, direkt aus einer HTML-Datei heraus Daten auf dem Rechner des Anwenders zu speichern und beim erneuten Aufruf der gleichen HTML-Datei wieder auszulesen. ...
Norbert
Moin, moin!
Hallo Norbert,
Wenn ich SELFHTML richtig gelesen habe, kann von einer Seite aus nur das Cookie gelesen werden, das von dieser Seite aus gesetzt wurde. Das Auslesen beliebiger Cookies von einer Startseite aus dürfte also nicht möglich sein:
Cookies ... bieten Ihnen die Möglichkeit, direkt aus einer HTML-Datei heraus Daten auf dem Rechner des Anwenders zu speichern und beim erneuten Aufruf der gleichen HTML-Datei wieder auszulesen. ...
Norbert,
nein, dass stimmt nicht ganz. Entscheident ist die Domain, nicht eine einzelne HTML-Seite. Sonst wären Cookies ja übrhaupt nicht mehr zu gebrauchen. Du kannst nur ein Cookie von derjenigen Domain aus lesen, von der es gesetzt wurde. Schau Dir mal an, wie Cookies (unter der Verwaltung des Browsers) abgespeichert werden. Dann wird es sicher klar.
Gruß
Hans-Peter