Come posso caricare il contenuto di un file di testo in una variabile javascript?


155

Ho un file di testo nella radice della mia app Web http: //localhost/foo.txt e vorrei caricarlo in una variabile in javascript .. in groovy vorrei fare questo:

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

Come posso ottenere un risultato simile in JavaScript?

Risposte:


142

XMLHttpRequest, ovvero AJAX, senza XML.

Il modo preciso in cui lo fai dipende dal framework JavaScript che stai utilizzando, ma se ignoriamo i problemi di interoperabilità, il tuo codice sarà simile a:

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

Normalmente, però, XMLHttpRequest non è disponibile su tutte le piattaforme, quindi alcuni lavori sono fatti. Ancora una volta, la soluzione migliore è utilizzare un framework AJAX come jQuery.

Un'ulteriore considerazione: funzionerà solo finché foo.txt è sullo stesso dominio. Se si trova su un dominio diverso, le politiche di sicurezza della stessa origine ti impediranno di leggere il risultato.


1
Una soluzione alternativa per la stessa politica di origine sta utilizzando JSONP che è supportato anche da jQuery (per la parte lato client)
OneWorld

3
potrebbe essere utile aggiungere che, all'interno di onreadystatechange, è possibile accedere alla proprietà readystate dell'oggetto XMLHttpRequest (nell'esempio: client.readystate) per sapere qual è lo stato, poiché l'evento onreadystatechange viene generato per il caricamento, il caricamento, .. .. quindi devi attendere client.readystate == 4 dentro onreadystatechange prima di poter utilizzare client.responseText.
GameAlchemist,

2
@GameAlchemist: inciampato sulla tua grande risposta. Volevo solo notare che nella maggior parte dei browser readyState ha un involucro di cammello, quindi il codice dovrebbe essere qualcosa del genere:if (client.readyState === 4){ }
snorpey

6
Inoltre puoi fare client.onloadende ottenere i dati completi
Athena,

2
La risposta deve essere redatta per includere il controllo del client.readyStatevalore della proprietà. Lo sto ridimensionando fino a quando non lo è, le persone non leggeranno i commenti per scoprire che la risposta è solo parzialmente giusta.
AMN

84

ecco come l'ho fatto in jquery:

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

che sembra non funzionare con semplici dati testuali tabulari ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
pesce

7
Si noti che questo non funziona se si sta testando in locale utilizzando file://cioè: file:///example.com/foo.html. Firefox si lamenta di un errore di sintassi e Chrome si blocca perché lo considera una richiesta Cross-Origin.
Akronix,

@pufferfish funzionerà con dati semplici se specifichi il dataTypeparametro, vedi api.jquery.com/jQuery.get/
yvesonline il

1
@Akronix se lasci la http://...parte, perché vive nello stesso dominio, funzionerà, ad es jQuery.get("foo.txt", ...).
yvesonline il

@Akronix C'è un modo semplice per testarlo localmente? Continuo a ricevere errori di richiesta di origine
incrociata

50

Aggiornamento 2019: utilizzo di 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
Sì Fetch è uno standard (recente), non un'estensione proprietaria.
Laurent Caillette,

1
È il 2019 e recuperare è una cosa bella. Questo è IL modo per tutti i browser moderni, incluso Samsung Internet, che ha appena raggiunto ...
Dave Everitt,

Un codice compatto e funzionante, Vic, grazie. Al fine di ottenere la gestione degli errori, sarebbe possibile mettere un po ' response.ok(o equivalente) da qualche parte nel codice? Non ho molta esperienza fetch, quindi non conosco il posto esatto in cui impostarlo.
Sopalajo de Arrierez,

Ottima soluzione Questo è stato super facile anche per un principiante completo. Memorizzato in variabile anziché console.log nell'ultimo passaggio, ora può essere utilizzato ovunque.
AveryFreeman

27

Se desideri solo una stringa costante dal file di testo, puoi includerla come 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 stringa caricata dal file diventa accessibile a JavaScript dopo essere stata caricata. Il carattere `(backtick) inizia e termina un modello letterale , consentendo sia i caratteri" che "nel blocco di testo.

Questo approccio funziona bene quando si tenta di caricare un file localmente, poiché Chrome non consentirà AJAX sugli URL con lo file://schema.


1
Questa sarebbe una soluzione davvero brillante. Ma il modello letterale non è supportato in IE11 e la variabile "let" non rientra nell'ambito quando si trova all'interno di un blocco funzione, quindi questa implementazione è piena di pericoli - attenzione.
Neville,

7

Una cosa da tenere a mente è che Javascript funziona sul client e non sul server. Non puoi davvero "caricare un file" dal server in Javascript. Quello che succede è che Javascript invia una richiesta al server e il server restituisce il contenuto del file richiesto. In che modo Javascript riceve i contenuti? Ecco a cosa serve la funzione di callback. Nel caso di Edward, cioè

    client.onreadystatechange = function() {

e nel caso di Danb, lo è

 function(data) {

Questa funzione viene chiamata ogni volta che arrivano i dati. La versione jQuery utilizza implicitamente Ajax, semplifica la codifica incapsulando quel codice nella libreria.


7

Aggiornamento 2020: utilizzo di Fetch con async / await

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

Si noti che awaitpuò essere utilizzato solo in una asyncfunzione. Un esempio più lungo potrebbe essere

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

Questo dovrebbe funzionare in quasi tutti i browser:

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

Inoltre, c'è la nuova FetchAPI:

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

1

Quando si lavora con jQuery, anziché utilizzare jQuery.get, ad es

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");
});

potresti usare ciò .loadche ti dà una forma molto più condensata:

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

.loadti dà anche la possibilità di caricare pagine parziali che possono tornare utili, vedi api.jquery.com/load/ .


-3

Se l'input è stato strutturato come XML, è possibile utilizzare la importXMLfunzione. (Maggiori informazioni qui su quirksmode ).

Se non è XML e non esiste una funzione equivalente per l'importazione di testo normale, è possibile aprirlo in un iframe nascosto e quindi leggere i contenuti da lì.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.