193 votes

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

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

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

Comment puis-je obtenir un résultat similaire en javascript ?

163voto

Edward Z. Yang Points 13760

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

La manière précise de procéder dépend du framework JavaScript que vous utilisez, mais si nous ne tenons pas compte des problèmes d'interopérabilité, votre code ressemblera à quelque chose comme ça :

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, et il faut donc procéder à quelques manipulations. Une fois encore, votre meilleure chance est d'utiliser un framework AJAX comme jQuery.

Une considération supplémentaire : cela ne fonctionnera que si foo.txt se trouve sur le même domaine. S'il se trouve sur un domaine différent, les politiques de sécurité de type same-origin vous empêcheront de lire le résultat.

1 votes

Une solution de contournement pour la politique de même origine consiste à utiliser JSONP qui est également supporté par jQuery (pour la partie côté client)

5 votes

Il pourrait être utile d'ajouter que, dans l'événement 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 que client.readystate == 4 dans l'événement onreadystatechange avant de pouvoir utiliser client.responseText.

3 votes

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

90voto

danb Points 3688

Voici comment je l'ai fait en jquery :

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

0 votes

Qui ne semble pas fonctionner avec des données en texte tabulaire simple ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests (en anglais) )

9 votes

Notez que cela ne fonctionne pas si vous le testez localement en utilisant la fonction file:// c'est-à-dire : file:///example.com/foo.html . Firefox se plaint d'une erreur de syntaxe et Chrome bloque car il considère qu'il s'agit d'une requête inter-origine.

0 votes

@pufferfish cela fonctionnera avec des données simples si vous spécifiez l'option dataType voir le paramètre api.jquery.com/jQuery.get/

79voto

Vic Points 3069

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 votes

Oui, Fetch est une norme (récente), et non une extension propriétaire.

1 votes

Nous sommes en 2019, et le fetch est une chose de toute beauté. C'est LA voie pour tous les navigateurs modernes, y compris Samsung Internet, qui vient de rattraper

0 votes

Un code compact et fonctionnel, Vic, merci. Afin de réaliser la gestion d'erreur, serait-il possible de mettre de la response.ok (ou équivalent) quelque part dans votre code ? Je ne suis pas très expérimenté en matière de fetch donc je ne sais pas où le mettre exactement.

40voto

Erik Uggeldahl Points 608

Si vous ne voulez qu'une chaîne constante du fichier texte, vous pouvez l'inclure en tant que 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 de caractères chargée à partir du fichier devient accessible à JavaScript après avoir été chargée. Le caractère `(backtick) commence et termine un fichier modèle littéral ce qui permet d'utiliser les caractères " et ' dans votre bloc de texte.

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

1 votes

Ce serait une solution très astucieuse. Mais le template literal n'est pas pris en charge par IE11 et la variable "let" serait hors de portée à l'intérieur d'un bloc de fonctions, de sorte que cette mise en œuvre est pleine de dangers - attention.

1 votes

À ce stade, même Microsoft est sur le point de retirer IE, et la portée peut être simplifiée en faisant une fonction qui renvoie la chaîne de caractères au lieu de définir une variable en utilisant 'let'.

19voto

gman Points 9074

Mise à jour 2020 : Utilisation de Aller chercher avec async/await

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

Notez que await ne peut être utilisé que dans un async fonction. 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');

1 votes

Tout va bien, sauf que l'origine nécessite d'avoir des cors, ce qui n'est pas forcément possible ou adapté pour beaucoup d'entre eux.

1 votes

C'est comme dire Q : "Comment retirer de l'argent d'une banque ?" A : "Allez à la banque et faites un chèque pour obtenir de l'argent". Vous : "C'est très bien, sauf si je veux retirer de l'argent du compte de quelqu'un d'autre, ce qui nécessite une procuration, mais je n'en ai pas pour la plupart des comptes". CORS est là pour une raison. C'est au serveur de décider si vous avez la permission de lire la ressource ou non.

0 votes

Yup. Toutefois, AJAX est préférable pour des raisons de non-correspondance des origines.

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