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.