Comment charger le contenu d'un fichier texte dans une variable javascript?


155

J'ai un fichier texte à la racine de mon application web http: //localhost/foo.txt et j'aimerais le charger dans une variable en javascript .. dans groovy je ferais ceci:

def fileContents = 'http://localhost/foo.txt'.toURL().text;
println fileContents;

Comment obtenir un résultat similaire en javascript?

Réponses:


142

XMLHttpRequest, c'est-à-dire AJAX, sans le XML.

La manière précise dont vous faites cela dépend du framework JavaScript que vous utilisez, mais si nous ignorons les problèmes d'interopérabilité, votre code ressemblera à ceci:

var client = new XMLHttpRequest ();
client.open ('GET', '/foo.txt');
client.onreadystatechange = function () {
  alert (client.responseText);
}
client.send ();

Normalement, cependant, XMLHttpRequest n'est pas disponible sur toutes les plates-formes, donc un peu de fudgery est fait. Encore une fois, votre meilleur pari est d'utiliser un framework AJAX comme jQuery.

Une considération supplémentaire: cela ne fonctionnera que tant que foo.txt est sur le même domaine. S'il s'agit d'un domaine différent, les politiques de sécurité de même origine vous empêcheront de lire le résultat.


1
Une solution de contournement pour la stratégie de même origine consiste à utiliser JSONP qui est également pris en charge par jQuery (pour la partie côté client)
OneWorld

3
il peut être utile d'ajouter que, dans onreadystatechange, vous pouvez accéder à la propriété readystate de l'objet XMLHttpRequest (dans l'exemple: client.readystate) pour savoir quel est le statut, puisque l'événement onreadystatechange est déclenché pour le chargement, chargé, .. .. vous devez donc attendre client.readystate == 4 dans onreadystatechange avant de pouvoir utiliser client.responseText.
GameAlchemist

2
@GameAlchemist: je suis tombé sur votre excellente réponse. Je voulais juste noter que dans la plupart des navigateurs, readyState est en boîtier camel, donc le code devrait être quelque chose comme ceci:if (client.readyState === 4){ }
snorpey

6
De plus, vous pouvez faire client.onloadendet obtenir simplement les données complètes
Athena

2
La réponse doit être expurgée pour inclure la vérification de la client.readyStatevaleur de la propriété. Je vote défavorablement jusqu'à ce que ce soit le cas, les gens ne liront pas les commentaires pour découvrir que la réponse n'est que partiellement correcte.
amn

84

voici comment je l'ai fait dans jquery:

jQuery.get('http://localhost/foo.txt', function(data) {
    alert(data);
});

qui ne semble pas fonctionner avec des données de texte tabulaire brut ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
pufferfish

7
Notez que cela ne fonctionne pas si vous le tester localement file://savoir: file:///example.com/foo.html. Firefox se plaint d'une erreur de syntaxe et de blocages Chrome car il le considère comme une requête Cross-Origin.
Akronix

@pufferfish cela fonctionnera avec des données simples si vous spécifiez le dataTypeparamètre, voir api.jquery.com/jQuery.get/
yvesonline

1
@Akronix si vous omettez la http://...partie, car elle vit sur le même domaine, cela fonctionnera, par exemple jQuery.get("foo.txt", ...).
yvesonline

@Akronix Existe-t-il un moyen simple de le tester localement? Je continue à recevoir des erreurs de demande d'origine
croisée

50

Mise à jour 2019: Utilisation de Fetch:

fetch('http://localhost/foo.txt')
  .then(response => response.text())
  .then((data) => {
    console.log(data)
  })

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API


4
Oui Fetch est une norme (récente), pas une extension propriétaire.
Laurent Caillette le

1
Nous sommes en 2019 et aller chercher est une chose de beauté. C'est LE moyen pour tous les navigateurs modernes, y compris Samsung Internet, qui vient de rattraper…
Dave Everitt

Un code compact et fonctionnel, Vic, merci. Afin de gérer les erreurs, serait-il possible d'en mettre response.ok(ou équivalent) quelque part dans votre code? Je ne suis pas très expérimenté fetch, donc je ne sais pas exactement où le placer.
Sopalajo de Arrierez

Excellente solution. C'était super facile même pour un débutant complet. Stocké dans la variable au lieu de console.log à la dernière étape, peut désormais être utilisé n'importe où.
AveryFreeman

27

Si vous ne voulez qu'une chaîne constante du fichier texte, vous pouvez l'inclure en JavaScript:

// This becomes the content of your foo.txt file
let text = `
My test text goes here!
`;
<script src="foo.txt"></script>
<script>
  console.log(text);
</script>

La chaîne chargée à partir du fichier devient accessible à JavaScript après avoir été chargée. Le caractère `(backtick) commence et termine un littéral de modèle , permettant à la fois les caractères" et 'dans votre bloc de texte.

Cette approche fonctionne bien lorsque vous essayez de charger un fichier localement, car Chrome n'autorisera pas AJAX sur les URL avec le file://schéma.


1
Ce serait une solution vraiment astucieuse. Mais le modèle littéral n'est pas pris en charge dans IE11 et la variable «let» serait hors de portée lorsqu'elle est à l'intérieur d'un bloc fonctionnel, donc cette implémentation est lourde de risques - attention.
Neville

7

Une chose à garder à l'esprit est que Javascript s'exécute sur le client et non sur le serveur. Vous ne pouvez pas vraiment "charger un fichier" depuis le serveur en Javascript. Ce qui se passe, c'est que Javascript envoie une requête au serveur, et le serveur renvoie le contenu du fichier demandé. Comment Javascript reçoit-il le contenu? C'est à cela que sert la fonction de rappel. Dans le cas d'Edward, c'est

    client.onreadystatechange = function() {

et dans le cas de danb, c'est

 function(data) {

Cette fonction est appelée chaque fois que les données arrivent. La version jQuery utilise implicitement Ajax, elle facilite simplement le codage en encapsulant ce code dans la bibliothèque.


7

Mise à jour 2020: Utilisation de Fetch avec async / await

const response = await fetch('http://localhost/foo.txt');
const data = await response.text();
console.log(data);

Notez que awaitne peut être utilisé que dans une asyncfonction. Un exemple plus long pourrait être

async function loadFileAndPrintToConsole(url) {
  try {
    const response = await fetch(url);
    const data = await response.text();
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

loadFileAndPrintToConsole('https://threejsfundamentals.org/LICENSE');


5

Cela devrait fonctionner dans presque tous les navigateurs:

var xhr=new XMLHttpRequest();
xhr.open("GET","https://12Me21.github.io/test.txt");
xhr.onload=function(){
    console.log(xhr.responseText);
}
xhr.send();

De plus, il y a la nouvelle FetchAPI:

fetch("https://12Me21.github.io/test.txt")
.then( response => response.text() )
.then( text => console.log(text) )

1

Lorsque vous travaillez avec jQuery, au lieu d'utiliser jQuery.get, par exemple

jQuery.get("foo.txt", undefined, function(data) {
    alert(data);
}, "html").done(function() {
    alert("second success");
}).fail(function(jqXHR, textStatus) {
    alert(textStatus);
}).always(function() {
    alert("finished");
});

vous pouvez utiliser .loadce qui vous donne une forme beaucoup plus condensée:

$("#myelement").load("foo.txt");

.loadvous donne également la possibilité de charger des pages partielles qui peuvent être utiles, voir api.jquery.com/load/ .


-3

Si votre entrée était structurée en XML, vous pouvez utiliser la importXMLfonction. (Plus d'informations ici à quirksmode ).

S'il ne s'agit pas de XML et qu'il n'y a pas de fonction équivalente pour importer du texte brut, vous pouvez l'ouvrir dans une iframe cachée, puis lire le contenu à partir de là.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.