2016-07-06 1 views
1

Juste pour signaler, je sais comment le faire avec jQuery et AngularJS. Le projet sur lequel je travaille actuellement m'oblige à utiliser du JavaScript simple. J'essaie de faire fonctionner AJAX avec du JavaScript simple. J'utilise Java/Spring pour la programmation backend. Voici mon code JavaScript:Obtenir AJAX pour travailler avec JavaScript

/** AJAX Function */ 
ajaxFunction = function(url) { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (xhttp.status == 200) { 
      var JSONResponse = JSON.parse(xhttp.responseText); 
      return JSONResponse; 
     } 
    } 
    xhttp.open('GET', url, true); 
    xhttp.send(); 
} 

/** Call Function */ 
searchResults = function() { 
    var test = ajaxFunction('http://123.456.78.90:8080/my/working/url'); 
    console.log(test); 
} 

/** When the page loads. */ 
window.onload = function() { 
    searchResults(); 
} 

Il convient de noter que quand je vais directement à l'URL dans ma barre d'adresse du navigateur (par exemple, si je vais directement sur le lien http://123.456.78.90:8080/my/working/url), je reçois une réponse JSON dans le navigateur .

Lorsque je survole xhttp.status, le statut indique 0, pas 200, même si je sais que le lien que j'appelle fonctionne. Est-ce quelque chose que vous devez définir dans les contrôleurs de Spring? Je ne pensais pas que c'était le cas parce que quand j'inspecte cet appel JS URL dans l'onglet Réseau, il indique que le statut est 200.

Dans l'ensemble, cette réponse revient undefined. Je ne peux pas comprendre pourquoi. Qu'est-ce que je fais mal?

+1

J'ai un peu d'expérience avec JavaScript, donc je ne me catégoriserais certainement pas comme ayant "aucune idée". Ma question portait spécifiquement sur AJAX. Je n'ai jamais dit que jQuery remplacerait JavaScript non plus. J'ai déjà posé des questions sur JavaScript auparavant, et une réponse commune est que tout ce que j'essaie de faire est plus facile à faire dans jQuery, c'est pourquoi j'ai fait ma première déclaration. Votre commentaire est impoli et non constructif. Si cette question faisait vraiment ressortir cette quantité de ressentiment, alors vous auriez pu aller sans répondre du tout. – aCarella

+1

Jetez un coup d'œil à l'onglet Réseau de la console de votre navigateur et observez la nature de la requête GET lorsque vous y accédez. En particulier, regardez les en-têtes de la requête. Vous devrez peut-être définir explicitement le type mime, par exemple. Ensuite, émulez simplement ce que votre navigateur fait avec succès dans votre requête JavaScript. Est-ce une URL publique? Pouvez-vous l'afficher, si oui? – ManoDestra

Répondre

1

Un XMLHttpRequest est créé de manière asynchrone, ce qui signifie que la demande est déclenchée et que le reste du code continue de s'exécuter. Un rappel est fourni et lorsque l'opération asynchrone est terminée, la fonction de rappel est appelée. La fonction onreadystatechange est appelée à la fin d'une requête AJAX. Dans votre exemple, le ajaxFunction retournera immédiatement après l'exécution de la ligne xhttp.send(), donc votre var test n'aura pas le JSON dedans comme je suppose que vous vous attendez.

Afin de faire quelque chose lorsqu'une requête AJAX est terminée, vous devez utiliser une fonction de rappel. Si vous voulez enregistrer le résultat à la console comme ci-dessus, vous pouvez essayer quelque chose comme ce qui suit:

var xhttp; 

var handler = function() { 
    if(xhttp.readyState === XMLHttpRequest.DONE) {  
     if (xhttp.status == 200) { 
      var JSONResponse = JSON.parse(xhttp.responseText); 
      console.log(JSONResponse); 
     } 
    } 
}; 

/** AJAX Function */ 
var ajaxFunction = function(url) { 
    xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = handler; 
    xhttp.open('GET', url, true); 
    xhttp.send(); 
};  

/** Call Function */ 
var searchResults = function() { 
    ajaxFunction('http://123.456.78.90:8080/my/working/url'); 
}; 

/** When the page loads. */ 
window.onload = function() { 
    searchResults(); 
}; 

Si vous voulez en savoir plus sur la façon dont fonctionne alors XMLHttpRequest MDN est un enseignant beaucoup mieux que moi :)

+1

Dois-je appeler la fonction de rappel n'importe où? Je le vois comme un paramètre dans ajaxFunction. Où puis-je l'utiliser? – aCarella

+0

Mes excuses, le paramètre de rappel n'est pas nécessaire dans ce cas, j'ai oublié de le supprimer. Bien que vous puissiez passer la fonction de rappel à votre fonction Ajax si vous vouliez le faire aussi –