AJAX XMLHttpRequest


Indholdsfortegnelse

    Vis indholdsfortegnelse


XMLHttpRequest-objektet bruges til at anmode om data fra en server.


Send en anmodning til en server

For at sende en anmodning til en server bruger vi metoderne open() og send() for XMLHttpRequest-objektet:

xhttp.open("GET", "ajax_info.txt", true);
 xhttp.send();
open(method, url, async)

Angiver typen af anmodning

metode: typen af anmodning: GET eller POST
url: serverens (fil) placering
asynkron: sand (asynkron) eller falsk (synkron)

send()

Sender anmodningen til serveren (bruges til GET)

send(string)

Sender anmodningen til serveren (bruges til POST)


URL'en - En fil på en server

URL-parameteren for open()-metoden er en adresse til en fil på en server:

xhttp.open("GET", "ajax_test.asp", true);

Filen kan være en hvilken som helst fil, såsom .txt og .xml eller serverscriptfiler som .asp og .php (som kan udføre handlinger på serveren, før du sender svaret tilbage).


Asynkron - sandt eller falsk?

Serveranmodninger skal sendes asynkront.

Asynkronparameteren for open() metode skal sættes til sand:

xhttp.open("GET", "ajax_test.asp", true);

Ved at sende asynkront JavaScript behøver ikke at vente på serversvaret, men kan i stedet:

  • udføre andre scripts, mens du venter på serversvar

  • håndtere svaret, når svaret er klar

Standardværdien for async-parameteren er async=true.

Du kan roligt fjerne den tredje parameter fra din kode.

Synchronous XMLHttpRequest (async=false) anbefales ikke, fordi JavaScript vil stop med at udføre, indtil serversvaret er klar. Hvis serveren er optaget eller langsom, applikationen hænger eller stopper.


GET anmodning eller POST anmodning?

GET er enklere og hurtigere end POST og kan bruges i de fleste tilfælde.

Brug dog altid POST-anmodninger, når:

  • En cachet fil er ikke en mulighed (opdater en fil eller database på serveren).

  • Sender en stor mængde data til serveren (POST har ingen størrelsesbegrænsninger).

  • Sender brugerinput (som kan indeholde ukendte tegn), POST er mere robust og sikker end GET.


FÅ anmodninger

En simpel GET anmodning:

Eksempel

xhttp.open("GET", "demo_get.asp");
 xhttp.send();

Prøv det selv →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>
<p id="demo"></p>

<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("GET", "demo_get.asp");
  xhttp.send();
}
</script>

</body>
</html>

I eksemplet ovenfor får du muligvis et cachelagret resultat. For at undgå dette skal du tilføje et unikt id til URL'en:

Eksempel

xhttp.open("GET", "demo_get.asp?t=" + Math.random());
 xhttp.send();

Prøv det selv →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>

<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("GET", "demo_get.asp?t=" + Math.random());
  xhttp.send();
}
</script>

</body>
</html>

Hvis du vil sende oplysninger med GET-metoden, skal du tilføje oplysningerne til URL'en:

Eksempel

xhttp.open("GET", "demo_get2.asp?fname=Henry&lname=Ford");
 xhttp.send();

Prøv det selv →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>

<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("GET", "demo_get2.asp?fname=Henry&lname=Ford");
  xhttp.send();
}
</script>
 
</body>
</html>

Hvordan serveren bruger inputtet, og hvordan serveren reagerer på en anmodning, forklares i et senere kapitel.



POST-anmodninger

En simpel POST anmodning:

Eksempel

xhttp.open("POST", "demo_post.asp");
 xhttp.send();

Prøv det selv →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>
 
<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("POST", "demo_post.asp");
  xhttp.send();
}
</script>

</body>
</html>

For at POST data som en HTML-formular skal du tilføje en HTTP-header med setRequestHeader(). Angiv de data, du vil sende i send()-metoden:

Eksempel

xhttp.open("POST", "ajax_test.asp");
 xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
 xhttp.send("fname=Henry&lname=Ford");

Prøv det selv →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>
 
<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("POST", "demo_post2.asp");
  xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhttp.send("fname=Henry&lname=Ford");
}
</script>

</body>
</html>
setRequestHeader(header, value)

Tilføjer HTTP-headere til anmodningen

header: angiver headernavnet
værdi: angiver overskriftsværdien


Synkron anmodning

For at udføre en synkron anmodning skal du ændre den tredje parameter i open()-metoden til false:

xhttp.open("GET", "ajax_info.txt", false);

Nogle gange bruges async=false til hurtig test. Du finder også synkrone anmodninger i ældre JavaScript-kode.

Da koden vil vente på serverens færdiggørelse, er der ikke behov for en onreadystatechange fungere:

Eksempel

xhttp.open("GET", "ajax_info.txt", false);
xhttp.send();
document.getElementById("demo").innerHTML = xhttp.responseText;

Prøv det selv →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>

<p id="demo">Let AJAX change this text.</p>

<button type="button" onclick="loadDoc()">Change Content</button>

<script>
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.open("GET", "ajax_info.txt", false);
  xhttp.send();
  document.getElementById("demo").innerHTML = xhttp.responseText;
}
</script>

</body>
</html>

Synchronous XMLHttpRequest (async=false) anbefales ikke, fordi JavaScript vil stop med at udføre, indtil serversvaret er klar. Hvis serveren er optaget eller langsom, applikationen hænger eller stopper.

Moderne udviklerværktøjer opfordres til at advare om brug synkrone anmodninger og kan give en InvalidAccessError-undtagelse, når den opstår.