AJAX XMLHttpRequest


Innehållsförteckning

    Visa innehållsförteckning


Objektet XMLHttpRequest används för att begära data från en server.


Skicka en förfrågan till en server

För att skicka en begäran till en server använder vi metoderna open() och send() för XMLHttpRequest-objektet:

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

Anger typen av begäran

metod: typen av begäran: GET eller POST
url: serverns (filens) plats
asynkron: sant (asynkront) eller falskt (synkront)

send()

Skickar begäran till servern (används för GET)

send(string)

Skickar begäran till servern (används för POST)


URL - En fil på en server

URL-parametern för metoden open() är en adress till en fil på en server:

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

Filen kan vara vilken typ av fil som helst, som .txt och .xml eller serverskriptfiler som .asp och .php (som kan utföra åtgärder på servern innan svaret skickas tillbaka).


Asynkron - sant eller falskt?

Serverförfrågningar ska skickas asynkront.

Asynkronparametern för open() metoden ska ställas in på true:

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

Genom att skicka asynkront kan JavaScript behöver inte vänta på serversvaret, utan kan istället:

  • kör andra skript medan du väntar på serversvar

  • hantera svaret efter att svaret är klart

Standardvärdet för async-parametern är async=true.

Du kan säkert ta bort den tredje parametern från din kod.

Synchronous XMLHttpRequest (async=false) rekommenderas inte eftersom JavaScript kommer sluta köra tills serversvaret är klart. Om servern är upptagen eller långsam, applikationen hänger eller stoppar.


GET begäran eller POST begäran?

GET är enklare och snabbare än POST och kan användas i de flesta fall.

Använd dock alltid POST-förfrågningar när:

  • En cachad fil är inte ett alternativ (uppdatera en fil eller databas på servern).

  • Skickar en stor mängd data till servern (POST har inga storleksbegränsningar).

  • Skickar användarinmatning (som kan innehålla okända tecken), POST är mer robust och säker än GET.


GET-förfrågningar

En enkel GET begäran:

Exempel

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

Prova själv →

<!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 exemplet ovan kan du få ett cachat resultat. För att undvika detta, lägg till ett unikt ID till URL:en:

Exempel

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

Prova själv →

<!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>

Om du vill skicka information med metoden GET, lägg till informationen i webbadressen:

Exempel

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

Prova själv →

<!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>

Hur servern använder indata och hur servern svarar på en förfrågan, förklaras i ett senare kapitel.



POST-förfrågningar

En enkel POST-förfrågan:

Exempel

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

Prova själv →

<!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>

För att POSTA data som ett HTML-formulär, lägg till en HTTP-rubrik med setRequestHeader(). Ange vilken data du vill skicka med metoden send():

Exempel

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

Prova själv →

<!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)

Lägger till HTTP-rubriker i begäran

huvud: anger rubrikens namn
värde: anger rubrikvärdet


Synkron förfrågan

För att utföra en synkron begäran, ändra den tredje parametern i metoden open() till false:

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

Ibland används async=false för snabbtestning. Du hittar också synkrona förfrågningar i äldre JavaScript-kod.

Eftersom koden väntar på att servern är färdig, finns det inget behov av en onreadystatechange fungera:

Exempel

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

Prova själv →

<!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) rekommenderas inte eftersom JavaScript kommer sluta köra tills serversvaret är klart. Om servern är upptagen eller långsam, applikationen hänger eller stoppar.

Moderna utvecklarverktyg uppmuntras att varna för användning synkrona förfrågningar och kan orsaka ett InvalidAccessError-undantag när det inträffar.