928 Stimmen

Wie kann ich einen AJAX-Aufruf ohne jQuery machen?

Wie kann ich einen AJAX-Aufruf mit JavaScript machen, ohne jQuery zu verwenden?

23 Stimmen

Bitte beachten Sie, dass viele der hier gegebenen Antworten darauf hinweisen, auf readystatechange zu hören, moderne Browser jetzt jedoch die Ereignisse load, abort, progress und error für XMLHttpRequest unterstützen (wahrscheinlich interessieren Sie sich nur für load).

9 Stimmen

youmightnotneedjquery.com eine Menge reiner js-Beispiele inkl. ajax für ie8+, ie9+ und ie10+

2 Stimmen

W3schools haben eine schöne schrittweise Einführung in Ajax ohne jQuery: w3schools.com/js/js_ajax_intro.asp

665voto

dov.amir Punkte 11219

Mit "Vanilla" (plain) JavaScript:

function loadXMLDoc() {
    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
           if (xmlhttp.status == 200) {
               document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
           }
           else if (xmlhttp.status == 400) {
              alert('Es gab einen Fehler 400');
           }
           else {
               alert('Etwas anderes als 200 wurde zurückgegeben');
           }
        }
    };

    xmlhttp.open("GET", "ajax_info.txt", true);
    xmlhttp.send();
}

Mit jQuery:

$.ajax({
    url: "test.html",
    context: document.body,
    success: function() {
      $(this).addClass("done");
    }
});

1 Stimmen

@Fractaliste Wenn Sie die Callbacks nach den If-Blöcken in Bezug auf den xmlhttp.status einfach aufrufen, rufen Sie sie einfach dort auf und sind fertig.

6 Stimmen

@Wade Ich glaube, Gokigooooks meint, dass er gedacht hat, als er Mit "reinem" JavaScript gelesen hat, dass es sich um eine JavaScript-Bibliothek handelt, die er herunterladen muss. Er könnte auch auf Vanilla JS Bezug nehmen.

231voto

Petah Punkte 43997

Mit dem folgenden Schnipsel können Sie ähnliche Dinge ziemlich einfach machen, wie zum Beispiel:

ajax.get('/test.php', {foo: 'bar'}, function() {});

Hier ist der Schnipsel:

var ajax = {};
ajax.x = function () {
    if (typeof XMLHttpRequest !== 'undefined') {
        return new XMLHttpRequest();
    }
    var versions = [
        "MSXML2.XmlHttp.6.0",
        "MSXML2.XmlHttp.5.0",
        "MSXML2.XmlHttp.4.0",
        "MSXML2.XmlHttp.3.0",
        "MSXML2.XmlHttp.2.0",
        "Microsoft.XmlHttp"
    ];

    var xhr;
    for (var i = 0; i < versions.length; i++) {
        try {
            xhr = new ActiveXObject(versions[i]);
            break;
        } catch (e) {
        }
    }
    return xhr;
};

ajax.send = function (url, callback, method, data, async) {
    if (async === undefined) {
        async = true;
    }
    var x = ajax.x();
    x.open(method, url, async);
    x.onreadystatechange = function () {
        if (x.readyState == 4) {
            callback(x.responseText)
        }
    };
    if (method == 'POST') {
        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    }
    x.send(data)
};

ajax.get = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async)
};

ajax.post = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url, callback, 'POST', query.join('&'), async)
};

1 Stimmen

Dies ist ein wirklich großartiger Start, aber ich denke, dir fehlt etwas, das in der Antwort von @3nigma vorkommt. Ich bin mir nicht sicher, wie sinnvoll es ist, bestimmte Anfragen (alle erhalten und einige posten) ohne Rückgabe der Serverantwort zu machen. Ich habe eine weitere Zeile am Ende der send-Methode hinzugefügt - return x.responseText; - und dann jede der ajax.send Aufrufe zurückgegeben.

3 Stimmen

@Sam, du kannst in der Regel nicht zurückkehren, da es sich um eine asynchrone Anfrage handelt. Du solltest die Antwort in einem Rückruf behandeln.

0 Stimmen

@Sam es gibt ein Beispiel darin: ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });

228voto

Will Munn Punkte 6273

Es gibt jetzt eine schönere Fetch API, die nativ in modernen Browsern verfügbar ist. Die Methode fetch() ermöglicht es Ihnen, Webanfragen zu stellen. Zum Beispiel, um JSON von /get-data anzufordern:

let options = {
  method: 'GET',      
  headers: {}
};

fetch('/get-data', options)
.then(response => response.json())
.then(body => {
  // Mach etwas mit dem body
});

Siehe MDN Web Docs: Nutzung der Fetch API für weitere Details.

async/await

Oder wenn Sie die Syntax async und await nutzen möchten, machen Sie dies:

async function doApi(url) {
  const response = await fetch(url);
  if( response.ok ) {
    if( 200 <= response.status && response.status <= 299 ) {
      const result = await response.json();
      // Mach etwas Tolles mit dem Ergebnis
    } else {
      console.log( `erhielt ein ${response.status}` );
    }
  }
}

Natürlich möchten Sie vielleicht die Antwortcodes usw. überprüfen, aber die Dokumentation behandelt das sehr ausführlich.

9 Stimmen

Es sollte hier eine Erwähnung des Polyfills von GitHub geben. github.com/github/fetch

10 Stimmen

Füge einfach </&zwnj;​script></code> hinzu und benutze fetch wie ein Profi.</x-turndown>

1 Stimmen

Verwenden Sie Fetch nicht auf dem Handy. Es hat ein Problem mit der Kleinschreibung des HTTP-Headers auf Android. Funktioniert gut auf iOS.

109voto

AbdelHady Punkte 8766

Sie können die folgende Funktion verwenden:

function callAjax(url, callback){
    var xmlhttp;
    // kompatibel mit IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
            callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

Sie können ähnliche Lösungen online auf diesen Links ausprobieren:

0 Stimmen

Auch wäre es schön, einige Eingabefelder für die Anfrage hinzuzufügen (werden in xmlhttp.send(request); verwendet).

2 Stimmen

@PavelPerna, da das Beispiel hier ein GET ist, können Sie sie einfach der Anfrage hinzufügen, aber um allgemeiner zu sein, bin ich bei dir, ich dachte wirklich daran, die Antwort zu aktualisieren, um Anforderungsparameter als Parameter für die Funktion hier zu akzeptieren, und auch um die Methode (GET oder POST) zu übergeben, aber das, was mich gestoppt hat, ist, dass ich die Antwort hier so einfach wie möglich halten möchte, damit die Leute es so schnell wie möglich ausprobieren können. Tatsächlich hasste ich einige andere Antworten, weil sie zuuuu lang sind, weil sie versuchen, perfekt zu sein :)

43voto

Rafay Punkte 30734
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        alert(this.responseText);
    }
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();

Die asynchrone Version würde so aussehen

var xhttp = new XMLHttpRequest();
xhttp.onload = function() {
    if (this.status == 200) {
        alert(this.responseText);
    }
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();

62 Stimmen

Nicht synchron aufrufen. Verwenden Sie xhReq.onload und benutzen Sie die Rückrufe.

3 Stimmen

@FellowStranger oReq.onload = function () { /*this.responseText*/ };

1 Stimmen

@Andrey: nichts, solange du realisierst, dass du die Ausführung aller Prozesse stoppst, bis die Antwort vom Server zurückkehrt. Nicht unbedingt schlimm, aber möglicherweise nicht genau angemessen für einige Zwecke.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X