929 votes

Comment faire un appel AJAX sans jQuery ?

Comment faire un appel AJAX en utilisant JavaScript, sans utiliser jQuery ?

23 votes

Veuillez noter que, bien que de nombreuses réponses suggèrent d'écouter prêt changement d'état Les navigateurs modernes prennent désormais en charge l'option charge , abandonner , progrès y erreur des événements pour XMLHttpRequest (vous ne vous soucierez probablement que de charge cependant).

2 votes

@ImadoddinIbnAlauddin par exemple lorsque sa principale fonctionnalité (traversée du DOM) n'est pas nécessaire.

9 votes

vousn'avezpasbesoindejquery.com beaucoup d'exemples de js purs, y compris ajax pour ie8+, ie9+ et ie10+.

667voto

dov.amir Points 3126

Avec le JavaScript "vanille" :

<script type="text/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('There was an error 400');
           }
           else {
               alert('something else other than 200 was returned');
           }
        }
    };

    xmlhttp.open("GET", "ajax_info.txt", true);
    xmlhttp.send();
}
</script>

Avec jQuery :

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

1 votes

@Fractaliste Si vous appelez simplement les callbacks après les blocs if relatifs au xmlhttp.status, alors il suffit de les appeler là et vous avez terminé.

6 votes

Wade, je pense que Gokigooooks dit que quand il a lu Avec JavaScript "vanille il pensait que c'était une bibliothèque JavaScript qu'il devait télécharger. Il pourrait aussi faire référence à Vanille JS .

232voto

Petah Points 18432

En utilisant le code suivant, vous pouvez faire des choses similaires assez facilement, comme ceci :

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

Voici l'extrait :

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 votes

C'est un excellent point de départ, mais je pense qu'il vous manque quelque chose qui figure dans la réponse de @3nigma. C'est-à-dire que je ne suis pas sûr de l'intérêt de faire certaines requêtes (toutes get et certaines post) sans renvoyer la réponse du serveur. J'ai ajouté une autre ligne à la fin de la méthode send : -- return x.responseText; -- et ensuite retourner chacun des ajax.send appels.

3 votes

@Sam vous ne pouvez [typiquement] pas renvoyer car il s'agit d'une requête asynchrone. Vous devez traiter la réponse dans un callback.

0 votes

@Sam il y a un exemple là-dedans : ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });

108voto

AbdelHady Points 576

Vous pouvez utiliser la fonction suivante :

function callAjax(url, callback){
    var xmlhttp;
    // compatible with 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();
}

Vous pouvez essayer des solutions similaires en ligne sur ces liens :

0 votes

Il serait également intéressant d'ajouter une variable d'entrée pour la demande (qui sera utilisée dans xmlhttp.send(request) ;).

2 votes

@PavelPerna, puisque l'exemple ici est une GET Mais pour être plus général, je suis d'accord avec vous, j'ai vraiment pensé à mettre à jour la réponse pour accepter les paramètres de la requête comme paramètre de la fonction ici, et aussi pour passer la méthode ( GET o POST ), mais ce qui m'a arrêté, c'est que je veux que la réponse soit aussi simple que possible pour que les gens puissent l'essayer aussi vite que possible. En fait, j'ai détesté certaines autres réponses qui étaient trop longues parce qu'elles essayaient d'être parfaites :)

42voto

3nigma Points 21164
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        alert(this.responseText);
    }
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();

62 votes

Ne faites pas d'appels synchrones. Utilisez xhReq.onload et utilisez les callbacks.

3 votes

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

4 votes

@kenansulayman Qu'est-ce qui ne va pas avec les appels synchrones ? Parfois, c'est ce qui convient le mieux.

30voto

brunops Points 112

Vous pouvez obtenir l'objet correct en fonction du navigateur avec

function getXmlDoc() {
  var xmlDoc;

  if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlDoc = new XMLHttpRequest();
  }
  else {
    // code for IE6, IE5
    xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return xmlDoc;
}

Avec le bon objet, un GET peut être abstrait :

function myGet(url, callback) {
  var xmlDoc = getXmlDoc();

  xmlDoc.open('GET', url, true);

  xmlDoc.onreadystatechange = function() {
    if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
      callback(xmlDoc);
    }
  }

  xmlDoc.send();
}

Et un POST à :

function myPost(url, data, callback) {
  var xmlDoc = getXmlDoc();

  xmlDoc.open('POST', url, true);
  xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  xmlDoc.onreadystatechange = function() {
    if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
      callback(xmlDoc);
    }
  }

  xmlDoc.send(data);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X