Henryk Plötz: " ' /' /" /" /' ' " ? wie jetzt nochmal "/ ' - ' \ " maskieren

Beitrag lesen

Moin

story[2]="<table width='200'><tr onMouseOver='infoein()' onMouseOut='infoaus()' onMouseMove='infoposition()'><td >"+variable1+"</td></tr></table> ";
nun soll infoein() 3 werte übergeben also normalerweise dann so geschrieben : infoein(variable1,variable2,variable3)
die variablen heisen x1 y1 und z1(bzw x2 x3 usw)
story[2]="<table width='200'><tr onMouseOver='infoein(x1,x2,x3)' onMouseOut='infoaus()' onMouseMove='infoposition()'><td >"+variable1+"</td></tr></table> ";

Bei deinem Beispiel sind eigentlich nirgendwo zusätzliche Anführungszeichen zu setzen, zumindest keine offensichtlichen.
Das Problem bei diesem Beispiel scheint eher beim Variablenscope zu liegen. So wie du das geschrieben hast, wird beim Überfahren der Maus über die Zeile (hmm, geht das überhaupt ?) der Code
infoein(x1,x2,x2);
aufgerufen. Wie es sich gehört, wird nun die Funktion infoein gesucht und ihr der Wert von (oder eine Referenz auf, je nachdem was es für Variablen sind) x1, x2 und x3 übergeben. Das bedeutet, dass alle 3 Variablen zu dem Zeitpunkt des Überfahrens definiert und mit einem Wert belegt sein müssen. Offensichtlich sind sie das nicht, daher die Fehlermeldung.

Andererseits könnte es aber auch sein, dass ich dich total missverstehe und du die Variablen gar nicht dort definiert haben willst, was angesichts des Subjects wahrscheinlicher ist :)
Das funktioniert nur, wenn x1, x2 und x3 keine Objekte sind, sondern zum Beispiel Strings. Du würdest dann wahrscheinlich wollen, das beim Mausüberfahren der Code
infoein("derwertvonx1","derwertvonx2","derwertvonx3");
ausgeführt wird. Aus deiner Zuweisung an story[2] müsstest du in diesem Fall
story[2]="<table width='200'><tr onMouseOver='infoein(""+x1+"",""+x2+"",""+x3+"")' onMouseOut='infoaus()' onMouseMove='infoposition()'><td >"+variable1+"</td></tr></table> ";
machen.

So, und damit dieses Posting nicht zu praktisch wird, noch ein bisschen trockene Theorie: :-)
Betrachten wir zunächst einmal einfach Zuweisungen von Strings:
a="Hallo Welt";
weist der Variable a den String   Hallo Welt   zu, klar. Wenn man nun aber   Hallo "Welt"   in die Variable schreiben will, geht "Hallo "Welt"" natürlich nicht, auch klar. Deshalb must du die Anführungszeichen die der Parser als ganz normale Zeichen betrachten und nicht interpretieren soll, mit einem \ schützen:
a="Hallo "Welt"";
Demnach ist aber nicht nur das Anführungszeichen " ein besonders Zeichen, sondern auch der Backslash , der muss also auch geschützt werden. Wenn du den String   Hallo Europa"Welt"   irgendwo zuweisen willst, musst du daraus also
a="Hallo Europa\"Welt"";
machen. Um den Code lesbarer zu machen gibt es in JavaScript noch einfache Anführungszeichen ', die aber in HTML für Parameterzuweisungen IIRC nicht benutzt werden dürfen. Damit kann man sich zumindest bei   Hallo "Welt"   aushelfen:
a='Hallo "Welt"';
Natürlich kann man die einfachen Anführungszeichen mit einem Backslash schützen und natürlich geht das auch andersrum:
a='wie geht's';
a="wie geht's";

Interessant wird der ganze Spaß aber, wenn du nun mehrere Ebenen von Code ineinander verschachteln willst. Dann musst du einfach immer von aussen nach innen dafür sorgen, dass das, was der jeweilige Interpreter aus deinem Code macht, auch vom Interpreter eine Ebene tiefer aktzeptiert wird. Und damit das richtig lustig wird, kann man in HTML auch nicht ein "-Zeichen mit einem Backslash schützen, sondern muss es in die Entitity " umwandeln, wobei das " dann wiederum durch ersetzen des & durch & geschützt werden würde.
Um also   Hallo "Welt"   onMouseOver mit alert() auszugeben brauchst du erstmal den JavaScript-Code für das alert():
alert("Hallo "Welt"");
und dann baust du das in den HTML-Code für onMouseOver ein und schützt dabei alle speziellen HTML-Zeichen die dir dabei über den Weg laufen, durch umwandeln in HTML-Entities:
onMouseOver="alert("Hallo "Welt"");"
(Das Beispiel ist absichtlich überkompliziert. Praktisch würdest du onMouseOver="alert('Hallo "Welt"');" verwenden)
Und das ganze in ein document.writeln() eingesetzt ergibt
document.writeln("onMouseOver="alert("Hallo \"Welt\"");"");
und so weiter und so fort. Spassig, gell?

Alle Klarheiten beseitigt? Gut, dann eine Frage:
Was schreibst du in den HTML-Code, wenn du   'Wer da?' \ "Ich bin's & wer bist du?"   (das soll ein String sein) nach dem Überfahren mit der Maus (onMouseOver) nach 10 Sekunden (setTimeout) mit document.writeln() ausschreiben willst?

--
Henryk Plötz
Grüße von der Ostsee