Perl-HTML-JavaScript-HTML
Slobodan
Hi Leute,
wie in dem Titel gesagt ist ein wenig kompliziert das ganze:
Ein Perl-Script soll ein HTML-Code ausgeben der einen Java-Script-Teil hat mit wiederum eine Funktion die HTML-Code ausgeben soll.
Das alles sieht wie folg. aus:
...
------------------------------
print "parent.frames[0].document.open();\n";
print "parent.frames[0].document.writeln ("<html><head>");\n";
print "parent.frames[0].document.writeln ("<script language=\"JavaScript\">");\n";
-- hier kommt javascript-code (natürlich angepasst) --
print "parent.frames[0].document.writeln ("</script>");\n";
print "parent.frames[0].document.writeln ("</head>");\n";
------------------------------
usw...
Nun meldet der Browser ein JavaScript-Fehler bei dem Tag </script>.
Was mache ich falsch und auf was sollte man grundsätzlich achten bei sollchen vielschichtigen Befehlen (Stichwort: Maskieren)?
Viel Dank
Slobo
Nun meldet der Browser ein JavaScript-Fehler bei dem Tag </script>.
Und der lautet:
IE:
Nichtabgeschlossene Zeichenfolgenkonstante
NS:
Unterminated String Literal
CU
Slobo
Ich denke da fehlt einfach ein abschliessendes "
Und der lautet:
IE:
Nichtabgeschlossene Zeichenfolgenkonstante
NS:
Unterminated String Literal
CU
Slobo
Das wird ja ein schönes Monolog werden:
Ich habe Lösung. Zwar nicht logische aber immerhin.
print "parent.frames[0].document.writeln ("<\/script>");\n";
Fragen Sie mich nicht wieso das funktioniert. Ich weis es nicht.
Vieleicht weis es jemand ?
Slobo
Das wird ja ein schönes Monolog werden:
Halb so wild! Ich bin ja auch noch da ...
Ich habe Lösung. Zwar nicht logische aber immerhin.
print "parent.frames[0].document.writeln ("<\/script>");\n";
Fragen Sie mich nicht wieso das funktioniert. Ich weis es nicht.
Vieleicht weis es jemand ?
Das ursprüngliche Problem ist, daß der Browser das </script> aus
print "parent.frames[0].document.writeln ("</script>");\n";
als Script-Ende erkennt - und anschließend dann seine Probleme bekommt ...
Im HTML-Text steht:
parent.frames[0].document.writeln ("</script>");
Der Trick ist nun, im JS auch einen Teil zu maskieren, so daß der Browser hier
kein Script-Ende sieht - die Ausgabe jedoch korrekt bleibt. Bsp.:
parent.frames[0].document.writeln ("</script>");
Um das '' durch Perl auszugeben muß dieses dort auch maskiert werden:
print "parent.frames[0].document.writeln ("<\/script>");\n";
Jörk
Danke Jörk (und andere)!
Ich werde also in Zukunft mehr auf maskieren aufpassen,
und (schon ausprobiert) die print <<"ETWAS"; mehr benutzen. Ist eine feine Sache. Und jemand sagte das es nicht in Perl-Dokumentation steht: Stimmt nicht - habe es in der Kamel-Bibel gefunden (im Index nur nach "<<" suchen).
Viel Spass noch ...
CU
Slobo
Hallo!
Danke Jörk (und andere)!
gern geschehen ...
Ich werde also in Zukunft mehr auf maskieren aufpassen,
Meisten ist es sogar das Beste, sich hier die Arbeit abnehmen zu lassen - per
quotemeta()
und (schon ausprobiert) die print <<"ETWAS"; mehr benutzen. Ist eine feine Sache. Und jemand sagte das es nicht in Perl-Dokumentation steht: Stimmt nicht - habe es in der Kamel-Bibel gefunden (im Index nur nach "<<" suchen).
Richtig! Wie ich schon schrieb steht das in der alten und in der neuen unter 'here-documents'
Um noch mal auf das ursprüngliche Problem zu kommen: Eine Kombination von here-documents und automatischen 'quotes' wäre hier wohl das pfiffigste. Zumal man bei Änderungen des HTML-Textes sich nicht jedesmal erneut mit den Problemen rumschlagen muss.
---------------------------------------------------------------------------------------
print &JSDocument( <<'EndOfDocument' );
<html><head>
<script language="JavaScript">
-- hier kommt javascript-code (natürlich angepasst) --
</script>
</head>
[...]
EndOfDocument
sub JSDocument {
my ($doc) = @_;
#-----------------------------------------------
# Jetzt jede einzelne Zeile mit einem JS-writeln
# erweitern
$doc =~ s/^(.*)$/'parent.frames[0].document.writeln ("' . quotemeta($1) . ')";'/em;
#-----------------------------------------------------------
# Als Rückgabewert können wir nun noch ein paar Anweisungen
# um die Ausgabe herumstricken ...
return <<"EndOfJS";
parent.frames[0].document.open();
$doc
[...]
EndOfJS
}
---------------------------------------------------------------------------------------
Auch bei here-document ist zu unterscheiden - zwischen einfachen und doppelten Anführungszeichen.
Viel Spaß noch,
Jörk
print "parent.frames[0].document.writeln ("</script>");\n";
Nun meldet der Browser ein JavaScript-Fehler bei dem Tag </script>.
Probier mal, </script> zu teilen, also nicht als einen String, sondern mit mit zwei Anweisungen auszugeben - z.B. </scr und ipt>
Christine
hi!
print "parent.frames[0].document.open();\n";
print "parent.frames[0].document.writeln ("<html><head>");\n";
print "parent.frames[0].document.writeln ("<script language=\"JavaScript\">");\n";
-- hier kommt javascript-code (natürlich angepasst) --
print "parent.frames[0].document.writeln ("</script>");\n";
Warum maskierst du hier das ">"?
print "parent.frames[0].document.writeln ("</head>");\n";
Soweit ich weiß sind ";" für Perl keine Sonderzeichen und müssen in Strings nicht maskiert werden.
auf was sollte man grundsätzlich achten bei sollchen vielschichtigen Befehlen (Stichwort: Maskieren)?
Nicht zuviele (vermeintliche Sonder-)Zeichen maskieren
Einfache ' verwenden statt den doppelten ", wenn möglich. Ein " ist nur nötig, wenn entweder Variablen/Skalare interpoliert werden sollen, oder wenn du diese Sonderzeichen wie \n etc. verwendest. Im obigen Fall wäre es - zumindest bei den angegebenen Zeilen - möglich, das zu nutzen und du hast viel Arbeit gespart.
Wenn lange Texte ausgegeben werden am besten gleich einen ganzen Block ausgeben, statt vor jede Zeile "print" zu schreiben, zb:
print <<'EOT';
<html><head>
...
EOT
EOT ist frei wählbar, muss am Anfang der Zeile stehen und danach muss mindestens ein Zeilenumbruch folgen. Die Art der Anführungszeichen beim "print" entspricht der bei einer Ausgabe von nur einer einzigen Zeile.
bye, Frank!
Wenn lange Texte ausgegeben werden am besten gleich einen ganzen Block ausgeben, statt vor jede Zeile "print" zu schreiben, zb:
print <<'EOT';
<html><head>
...
EOT
Aber dann konsequent sein, bitte :-)
Fuer den JS-Teil ist es auch besser, statt lauter
document.write('kurzer String');
einen laengeren String zusammenzubauen. Die Ausgabe geht schneller, merkt der Besucher, wenn es viel ist.
Ich mache das meistens so:
var Ausgabe = '';
Ausgabe += 'Jetzt geht es los. ';
Ausgabe += 'Und hier kommt noch mehr';
...
document.writeln(Ausgabe)
Christine
Hallo Frank,
print <<'EOT';
<html><head>
...
EOT
Weisst Du eigentlich, seit welcher Version des Perl-Interpreters das so funktioniert? In aelteren Buechern findet man das naemlich nie, und dabei ist es doch so praktich...
viele Gruesse
Stefan Muenz
hi!
print <<'EOT';
<html><head>
...
EOT
Weisst Du eigentlich, seit welcher Version des Perl-Interpreters das so funktioniert? In
aelteren Buechern findet man das naemlich nie, und dabei ist es doch so praktich...
Leider nicht. Aber auch im aktuellen Kamelbuch über Perl5 ist das nicht zu finden, zumindest habe ich es noch nicht bemerkt.
bye, Frank!
Hallo auch!
print <<'EOT';
<html><head>
...
EOT
Weisst Du eigentlich, seit welcher Version des Perl-Interpreters das so funktioniert? In
aelteren Buechern findet man das naemlich nie, und dabei ist es doch so praktich...Leider nicht. Aber auch im aktuellen Kamelbuch über Perl5 ist das nicht zu finden, zumindest habe ich es noch nicht bemerkt.
Es steht sowohl im aktuellen als auch im alten Kamelbuch. Das Feature schimpft sich
'here-documents' oder im deutschen 'Hier-Dokumente' ;-)
Gruß,
Jörk
hi!
Leider nicht. Aber auch im aktuellen Kamelbuch über Perl5 ist das nicht zu finden,
zumindest habe ich es noch nicht bemerkt.
Es steht sowohl im aktuellen als auch im alten Kamelbuch. Das Feature schimpft sich
'here-documents' oder im deutschen 'Hier-Dokumente' ;-)
Tatsache. Wie kommt jemand darauf, dem einen so lächerlichen Namen zu geben? Wer soll denn darauf kommen?
bye, Frank!
Hallo Frank,
Es steht sowohl im aktuellen als auch im alten Kamelbuch. Das Feature schimpft sich
'here-documents' oder im deutschen 'Hier-Dokumente' ;-)Tatsache. Wie kommt jemand darauf, dem einen so lächerlichen Namen zu geben? Wer soll denn darauf kommen?
Das ist dann wieder so eine Sache von gewußt wie (oder wo)! Die Bezeichnung so jedenfalls
sagen, daß man über diese Anweisung die Möglichkeit hat, Textmehrzeiler (Dokument ;-)
direkt in den Source-Code einzugeben. Ein Statement, welches nun auf dieses Dokument
zurückgreift, besagt dann soetwas wie 'print' das Dokument hier <stammel>.
ciao,
Jörk
Hallo Stefan,
Frage dieses theads ist schon ne vertractkte Sache, aber ich denke Jörk hat die Antwort gefunden. (Sowas hat mich auch lange mal beschaeftigt).
Kannst Du es an die Web-Weisheits-Dokumentationsstelle weitergeben.
Tschuess
Olaf