Moin
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?
<div onMouseOver="window.setTimeout("document.writeln(\"'wer da?'\"ich bin's & wer bist du?\"\")",10000)"> hier Maus drüber.</div>
so in etwa?
Leider nicht ganz. Mal vom Anfang ausgehen:
'Wer da?' \ "Ich bin's & wer bist du?"
wäre der auszugebende HTML-Code. Das kaufmännische Und muss zwar in diesem Fall nicht unbedingt maskiert werden, aber besser ist das. Das setzen wir jetzt in ein document.writeln ein. Dafür verwende ich doppelte Anführungszeichen (weil dann ein Zeichen weniger zu maskieren ist), das heisst alle Backslashes und alle doppelten Anführungszeichen im String müssen maskiert werden:
document.writeln("'Wer da?' \ "Ich bin's & wer bist du?"");
Das in ein setTimeout einzusetzen bereitet auch wenig Probleme: Ich nehme zur Abwechslung mal einfache Anführungszeichen und escape daher alle \ und ' :
setTimeout('document.writeln("'Wer da?' \\ \"Ich bin's & wer bist du?\"")',10000);
und das in einen HTML-Parameter zu schreiben ist dann reine Routine: alle speziellen HTML-Zeichen, also in diesem Fall das doppelte Anführungszeichen und das Kaufmannsund müssen geschützt werden:
onMouseOver="setTimeout('document.writeln("'Wer da?' \\ \"Ich bin's & wer bist du?\"")',10000);"
fertsch!
Bei deinem Versuch
onMouseOver="setTimeout("document.writeln(\"'wer da?'\"ich bin's & wer bist du?\"\")",10000)"
ist zumindest das hier ^^ falsch, denn in HTML-Parametern werden die Zeichen nicht durch voranstellen eines \ escaped, sondern durch umwandeln in eine HTML-Entitity.
muss man das ' auch anders darstellen(uli meybohms editor macht das immer automatisch *gg*)
Also eigentlich würde ich jetzt Nein sagen wollen und anmerken, dass die einzigen Zeichen die du wirklich ersetzen _musst_, ", &, < und > sind, da dies die einzigen Zeichen sind die in einem Parameterwert eine besondere Bedeutung haben sollten. Weitere Zeichen wie komische Umlaute äöü und andere Sonderzeichen _solltest_ du ersetzen, kannst es aber auch sein lassen, wenn du im HTML-Head den richtigen Zeichensatz angegeben hast und einfach mal hoffst dass der Client damit klarkommt.
Ich hab mir aber grad sagen lassen, dass man Parameterwerte auch in einfache Anfühungszeichen einschliessen kann, und dann muss man die einfachen Anführungszeichen logischerweise auch maskieren (kann aber dafür die doppelten Anführungszeichen in Ruhe lassen). Soweit ich das in SelfHTML sehen kann, gibt es keine benannte Entitity für einfache Anführungszeichen, du müsstest sie also durch ' darstellen. Da würde ich dann doch raten, lieber immer nur doppelte Anführungszeichen zu nehmen, das wird übersichtlicher.
hm.. aber ich würde es doch so machen (ohne gegen deine angaben zu verstossen
Ja, auch sehr gut möglich. Weil es solche Wege immer gibt, braucht man eigentlich selten mehr als zwei Ebenen ineinander verschachtelte Strings.
document.writln("'Wer da?' \ "Ich bin's & wer bist du?" ");
Vorsicht hier, das geht so ^^^^^^ nicht.
so bevor du anfängst die fehler zu zählen,du hattest mich richtig verstanden, es sind definierte variable mit werten
die variablen werden genau 2 zeilen über der oben gezeigten script zeile definiert und mit einem wert versehen, wenn ich alert(x1) mache sagt er mir braf den wert, aber wenn ich das wie du sagst einfach so da reinschreibe [infoein(x1,y1,z1)] dann sind sie plötzlich undefiniert ...
Ja, du musst hier drauf achten, wann welcher Code wo ausgeführt wird. Das alert() wird sofort ausgeführt und gibt dir daher den richtigen Wert zurück. Der Code, den du in den onMouseOver-Parameter geschrieben hast, wird jedoch erst onMouseOver, also erst beim Überfahren mit der Maus ausgeführt. Bis dahin kann mit den Variablen noch eine Menge passieren, aber das ist hier wahrscheinlich nicht das Problem, sondern wenn du den Code der die Variablen definiert (Funktionsparameter?) und den HTML-Code schreibt in einer Funktion ausführst, dann wird der Code
infoein(x1,x2,x3);
vor allem auch in einem anderen Variablenscope ausgeführt. Die Variablen sind dann nur in der Funktion definiert und später, wenn die Maus drüber fährt und die Funktion beendet ist, ist von diesen Variablen nix mehr übrig.
2 Lösungsmöglichkeiten:
1. Du verwendest globale Variablen, das wird zwar häufig (zu recht) als unschön angesehen, ist aber am einfachsten. Dazu musst du einfach vorher die Variablen x1, x2 und x3 als global definieren und bist im Prinzip fertig. Codebeispiel
<script language="javascript" type="text/javascript">
var x1,x2,x3;
function huhu()
{
// Hier werden die Variablen mit Werten belegt
x1="1"; x2="2"; x3="3";
document.writeln("<a href="#" onMouseOver="infoein(x1,x2,x3);">foobar</a>");
}
</script>
Dann wird der HTML-Code <a href="#" onMouseOver="infoein(x1,x2,x2)">foobar</a> ins Fenster geschrieben und wenn die Maus über den Link fährt, sind die 3 Variablen immer noch definiert und alles geht prima. Nachteil: Du kannst nicht einfach innerhalb der Funktion schreiben
x1="4";
document.writeln("<a href="#" onMouseOver="infoein(x1,x2,x3);">ein Link mit anderen Parametern</a>");
2. Du schreibst den Wert der Variablen zum Zeitpunkt des Funktionsaufrufes in das Fenster und musst dann dementsprechend Anfüührungszeichen verwenden. Das ist das was du machen willst.
Codebeispiel:
<script language="javascript" type="text/javascript">
function huhu()
{
// Hier werden die Variablen definiert und mit Werten belegt
var x1="1", x2="2", x3="3";
document.writeln("<a href="#" onMouseOver="infoein('"+x1+"','"+x2+"','"+x3+"');">baz</a>");
}
</script>
Vorteil: Das kannst du sooft du willst mit unterschiedlichen Werten machen. Nachteil: Das geht evt. schief, wenn der Variablenwert ein spezielles HTML-Zeichen ("&<>) enthält. Ausserdem klappt das nicht mit Objekten.
Das Problem mit den HTML-Zeichen kannst du ganz einfach lösen, indem du diese Zeichen ersetzt. Ich weiss gar nicht, ob JavaScript schon eine fertige Funktion dafür hat, in PHP ist jedenfalls htmlentities() dein Freund (und das meine ich wirklich so, wenn du einfach alle Benutzereingaben vor das Ausgabe durch htmlentities laufen lasst, hast du kaum noch Probleme mit bösen Benutzereingaben). Eine mögliche Implementation in JavaScript ist
function htmlentities(string)
{
return string.replace(/&/,"&").replace(/"/,""").replace(/</,"<").replace(/>/,">");
}
Hoffe geholfen zu haben
--
Henryk Plötz
Grüße von der Ostsee