Du kan lave et PHP-dokument, der ser sådan ud:
<?
if ( isset($_GET["type"]) && $_GET["type"]=="moz" ) {
Header("Content-Type: text/xml");
print "bla=noget om id: ".$_GET["id"]."&blabla=noget andet om id: ".$_GET["id"];
} else {
print "myVars['bla']='noget om id: ".$_GET["id"]."';";
print "myVars['blabla']='noget andet om id: ".$_GET["id"]."';";
print "myFunc();";
}
?>
Så kan du lave et HTML-doku, der ser sådan ud:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"
http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>TITLE</title>
<script id="myData" type="text/JavaScript"></script>
<script type="text/JavaScript">
var myVars = new Array();
function myFunc(var1, var2) {
alert(myVars["bla"] + "\n" + myVars["blabla"])
}
function getMyData(id) {
var url, req, aTmp, aVars;
url = "dataDoc.php?id=" + id;
try {
req = new XMLHttpRequest();
url += "&type=moz";
req.open("GET", url, false);
req.send(null);
aTmp = req.responseText.split("&");
for (i=0; i<aTmp.length; i++) {
aVars = aTmp[i].split("=");
myVars[aVars[0]] = aVars[1];
}
myFunc();
}
catch(e) {
url += "&u=" + new Date().getTime();
document.getElementById("myData").src = url;
}
}
</script>
</head>
<body>
<button onclick="getMyData(5)">TEST</button><br>
<button onclick="getMyData(8)">TEST 2</button>
</body>
</html>
Gecko-baserede browsere kan ikke så godt loade JS-filer ind i et JS-tag. Derfor opretter vi i dem et XMLhttpRequest objekt og henter filen med det. Derefter splitter vi request-objektets returnerede 'responseText' og fylder vores variabler ned i variabel-array'et 'myVars' - for til sidst at kalde funktionen, der skal lave noget med de hentede variabler (i eksemplet her: alert'e dem ud).
Er der ikke tale om en Gecko, kan vi sætte en ny source på JS-tag'et - og lade den loadede JS-fil selv lægge variablerne i 'myVars'.
Opera vil ikke afvikle JS fra filen anden gang den samme URI loades i JS-tag'et. Dvs, hvis vi sender den samme query-streng to gange i træk (samme id). Derfor laver jeg det lille trick med at sætte en ekstra variabel 'u' på URL'en. Den indeholder et timestamp med millisekunder - og gør dermed URI'en unik.
Grunden til at myFunc() kaldes i JS-filen er, at ellers ved vi ikke, hvornår variablerne i 'myVars' er nået at blive opdateret.
Er der tale om en XMLhttpRequest, kan vi lade den 'hænge', indtil der kommer noget retur fra serveren. Det afgøres af 'false' i linien:
req.open("GET", url, false);
Når der er sendt, bliver JS hængende og afventer svar fra serveren, før den går videre, hvorfor vi kan tillade os at kalde funktionen lige efter.
Spørg, hvis der er noget, du ikke forstår :)