Einige Dinge gilt es zu beachten: Eingebaute JavaScript-Funktionen dürfen beispielsweise nicht verwendet werden. Das ist auch der Grund, warum im Beispiel die Funktion „delete_task“ anstatt „delete“ heißt. Darüber hinaus sollte man sich unter Windows nicht wundern, wenn in den URLs, die für den Request benutzt werden, bei längeren Skriptnamen so etwas wie „INDEX_~1.CGI“ als URL in der JavaScript-Funktion steht. Das liegt daran, dass Windows intern die Länge von Dateinamen auf 8 Zeichen kürzt.
Leicht irreführend ist auch die Meldung eines „Internal Server Error“ – in den Log-Dateien findet sich eine Meldung „POSSIBLE SECURITY INCIDENT!“ – nach dem Aufruf einer nicht-existenten Funktion des CGI-Skript durch den GET-Request des XMLHttpRequest-Objekts.
Auch bei der Verwendung von CGI::Application muss man aufpassen. Da die Perl-Subroutinen direkt ausgeführt werden, steht das Objekt von CGI::Application nicht zur Verfügung. Deshalb muss man auf Codereferenzen verzichten und stattdessen eine „externe“ URL angeben.
#!/usr/bin/perl
use CGI;
use CGI::Ajax;
my $cgi = CGI->new();
my $ajax = CGI::Ajax->new(jsecho => \&perlecho);
print $ajax->build_html( $cgi, html() );
sub perlecho{
return @_;
}
sub html{
return q~<html><body>
<input type="text" id="echofield" onkeyup="jsecho(['echofield'],['test'])">
<div id="test"></div>
</body></html> ~;
}
Listing 3
Was geschieht hier? In den ersten drei Zeilen werden die benötigten Module geladen. Dann wird das Mapping realisiert: CGI::Ajax erzeugt eine JavaScript-Funktion „jsecho“, in der mit einem XMLHttpRequest-Objekt ein GET-Request aufgerufen wird. Die Funktion, die im CGI-Skript ausgeführt werden soll, heißt „perlecho“. Zeile sechs löst die Header und die HTML-Ausgabe aus. build_html erzeugt den JavaScript-Code, der in den Head-Bereich des HTML-Codes eingefügt wird. Im Input-Feld wird festgelegt, dass auf Tastendruck die Funktion „jsecho“ aufgerufen werden soll. Dabei wird der Wert des HTML-Elements mit der ID 'echofield' an den Server übergeben. Das Ergebnis wird dann im HTML-Element mit der ID 'test' dargestellt.






