Moin Julia!
Oh je, so ein langer Thread, und jede zweite Antwort ist von Christoph Schnauss. Lass mich raten - er hat im kompletten Thread irgendwelchen Schwachsinn erzaehlt und Du bist jetzt ziemlich verwirrt? Und natuerlich bist Du der Loesung Deines Problems keinen Schritt naeher gekommen? Dann graeme Dich nicht, denn es liegt nicht an Dir. Das macht er immer so.
[quotes rearranged]
ich wollt mal fragen wie ich ein cgi-programm mit javascript starten kann.
Naja, der Terminus "CGI-Programm starten" ist schlecht gewaehlt. Bei HTTP fordert man immer nur URLs an. Wenn hinter einer URL so ein CGI-Prog steht, wird es dann natuerlich ausgefuehrt. Ich weiss, das kommt auf's selbe raus, aber man sollte sich des Unterschiedes bewusst sein. Denn wenn Du schreibst:
aber es sollte keine location.herf sein, weil da kommen die besucher zum prog, dass prog soll aber nur im hintergrund ausgeführt werden.
dann musst Du Dir klar machen, dass das Anfordern einer URL immer in der Rueckgabe irgendeines Contents resultiert.[1] Die Frage lautet also eher: Wie kann ich den Content moeglichst gut vorm Besucher verstecken.
if(navigator.cookieEnable == true) {
//programm starten
}
Also ohne die Bedingung, dass die URL nur angefordert wird, wenn navigator.cookieEnabled true ist, waere das wirklich leichter. Aber nichts ist unmoeglich.[2]
Man koennte nun abhaengig von navigator.cookieEnabled mit document.write() einen <script>- oder <img>-Tag schreiben. Im Falle von <script> kannst Du einfach ein einzeiliges kleines JS zurueckgeben, welches nur aus einem Kommentar besteht. Oder - falls es sich bei dem CGI-Prog um einen Counter handelt, kannst Du auch eine Zeile mit einer Variable ausgeben, die den Counterstand enthaelt. Bei <img> muss vom Script ein unsichtbares Bild zurueckgeliefert werden. Dazu kannst Du einfach ein herkoemmliches transparentes GIF nehmen und dieses mit dem Content-Type "image/gif" vom Script ausgeben lassen (siehe weiter unten). Ach so, bei <script> musst Du den Content-Type "text/javascript" benutzen.
Ich mag document.write() allerdings nicht so, da einige Browser ziemliche Probleme damit haben und manchmal sinnlose Sachen machen oder gleich abstuerzen. Daher eine andere Moeglichkeit: Baue ein Dummy-Bild fest in Deine Seite ein und gib dem <img>-Tag aber einen guten Namen:
<img id="counter-dummy-img" name="counter-dummy-img" src="/images/1x1-dummy.gif" width="1" height="1" alt="">
Dann kannst Du spaeter mit JS auf dieses Bild zugreifen und die Eigenschaft .src aendern (also normales Bilderwechselscript), wobei Du die URL Deines CGI-Scripts uebergibst. Das CGI-Script muss natuerlich wieder so ein transparentes GIF ausgeben.
Wenn ich schreibe, das CGI-Script muss ein Bild zurueckgeben, dann hast Du da verschiedene Moeglichkeiten. Du kannst einerseits so eine Bilddatei auf dem Server liegen haben. Die oeffnest Du in Deinem Programm, liest den Inhalt in eine Variable, und schreibst den Inhalt der Variablen gleich wieder an STDOUT (Content-Type nicht vergessen!). Oder Du hast das Bild in Deinem normalen URL-Baum und antwortest vom Script aus einfach mit
print("Location: http://www.domain.de/images/another-1x1-dummy.gif\n\n");
(oder wie immer das in der von Dir verwendeten Sprache gemacht wird). Dann wird der Browser einfach an die Bild-Datei weitergeleitet (302-Response) und fordert sie dann separat an. Beachte unbedingt, dass Du in diesem Fall die *vollstaendige* URL angeben musst. Einfach nur "/images/...gif" ist *nicht* erlaubt, auch wenn viele Browser da tolerant sind. Oder, eine weitere Moeglichkeit, Du kannst die Daten des Bildes irgendwie codiert direkt in Dein Script schreiben und dann jedesmal decodieren und die Binaerdaten ausgeben. Base64 waere eine Codierung, die in diesem Zusammhang sinnvoll ist. Wie das genau geht, findest Du entweder allein raus oder nimmst vielleicht besser eine der anderen Varianten. ;-)
<script language="javascript">
Korrekt lautet das: <script type="text/javascript">
Wenn Du auf sehr alte Browser Ruecksicht nehmen willst, kannst Du das language-Attribut ja noch zusaetzlich angeben. (Ist aber nur fuer HTML Transitional gueltig.)
[1] Ok, es gibt da noch die Variante, eine 204-Antwort zurueck zu liefern, d.h. es gibt explizit keinen Content. Aber ich weiss nicht, inwieweit die Browser da mitspielen.
[2] ausser vielleicht, Christoph dazu zu bringen, weniger Unsinn zu posten
HTH && So long
--
Es gibt Diebe, die nicht bestraft werden und einem doch das Kostbarste stehlen: die Zeit.
-- Napoleon Bonaparte