Bagaimana cara memuat konten file teks ke dalam variabel javascript?

155

Saya memiliki file teks di root aplikasi web saya http: //localhost/foo.txt dan saya ingin memuatnya ke dalam variabel di javascript .. di groovy saya akan melakukan ini:

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

Bagaimana saya bisa mendapatkan hasil yang serupa dalam javascript?

danb
sumber

Jawaban:

142

XMLHttpRequest, yaitu AJAX, tanpa XML.

Cara tepat Anda melakukan ini tergantung pada kerangka JavaScript apa yang Anda gunakan, tetapi jika kami mengabaikan masalah interoperabilitas, kode Anda akan terlihat seperti:

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

Namun secara normal, XMLHttpRequest tidak tersedia di semua platform, jadi beberapa fudgery dilakukan. Sekali lagi, taruhan terbaik Anda adalah menggunakan kerangka kerja AJAX seperti jQuery.

Satu pertimbangan tambahan: ini hanya akan berfungsi selama foo.txt ada di domain yang sama. Jika berada di domain yang berbeda, kebijakan keamanan asal-sama akan mencegah Anda membaca hasilnya.

Edward Z. Yang
sumber
1
Solusi untuk kebijakan yang sama-asal menggunakan JSONP yang juga didukung oleh jQuery (untuk bagian sisi klien)
OneWorld
3
mungkin berguna untuk menambahkan bahwa, di dalam onreadystatechange, Anda dapat mengakses properti readystate dari XMLHttpRequest Object (dalam contoh: client.readystate) untuk mengetahui apa statusnya, karena event onreadystatechange dinaikkan untuk memuat, memuat, .. .. jadi Anda harus menunggu client.readystate == 4 di dalam onreadystatechange sebelum Anda dapat menggunakan client.responseText.
GameAlchemist
2
@GameAlchemist: menemukan jawaban Anda yang luar biasa. Saya hanya ingin mencatat bahwa di sebagian besar browser readyState dikurung unta, jadi kodenya harus seperti ini:if (client.readyState === 4){ }
snorpey
6
Selain itu Anda dapat melakukan client.onloadenddan hanya mendapatkan data yang lengkap
Athena
2
Jawabannya harus dihapus untuk menyertakan memeriksa nilai client.readyStateproperti. Saya downvoting sampai itu, orang tidak akan membaca komentar untuk menemukan jawabannya hanya sebagian benar.
amn
84

di sini adalah bagaimana saya melakukannya di jquery:

jQuery.get('http://localhost/foo.txt', function(data) {
    alert(data);
});
danb
sumber
yang tampaknya tidak berfungsi dengan data teks tabel biasa ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
pufferfish
7
Perhatikan bahwa ini tidak bekerja jika Anda menguji secara lokal menggunakan file://yaitu: file:///example.com/foo.html. Firefox mengeluhkan kesalahan sintaksis dan blok Chrome karena menganggapnya sebagai permintaan Cross-Origin.
Akronix
@pufferfish itu akan bekerja dengan data biasa jika Anda menentukan dataTypeparameter, lihat api.jquery.com/jQuery.get/
yvesonline
1
@Akronix jika Anda meninggalkan http://...bagian, karena ia hidup di domain yang sama, itu akan berfungsi, misalnya jQuery.get("foo.txt", ...).
yvesonline
@ Akronix Apakah ada cara mudah untuk mengujinya secara lokal? Saya terus mendapatkan kesalahan permintaan asal-Silang
ahuff44
50

Pembaruan 2019: Menggunakan Ambil:

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

Vic
sumber
4
Ya Ambil adalah standar (baru), bukan ekstensi milik.
Laurent Caillette
1
Ini tahun 2019, dan mengambil adalah hal yang indah. Ini adalah cara untuk semua browser modern, termasuk Samsung Internet, yang baru saja menyusul ...
Dave Everitt
Kode yang ringkas dan berfungsi, Vic, terima kasih. Untuk mencapai penanganan kesalahan, apakah mungkin untuk menempatkan response.ok(atau setara) di suatu tempat dalam kode Anda? Saya tidak terlalu berpengalaman fetch, jadi saya tidak tahu tempat yang tepat untuk mengaturnya.
Sopalajo de Arrierez
Solusi bagus Ini sangat mudah bahkan untuk pemula yang lengkap. Disimpan dalam variabel alih-alih console.log pada langkah terakhir, sekarang dapat digunakan di mana saja.
AveryFreeman
27

Jika Anda hanya menginginkan string konstan dari file teks, Anda dapat memasukkannya sebagai 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>

String yang dimuat dari file menjadi dapat diakses oleh JavaScript setelah dimuat. Karakter `(backtick) memulai dan mengakhiri literal templat , memungkinkan karakter" dan 'di blok teks Anda.

Pendekatan ini berfungsi dengan baik ketika Anda mencoba memuat file secara lokal, karena Chrome tidak akan mengizinkan AJAX pada URL dengan file://skema tersebut.

Erik Uggeldahl
sumber
1
Ini akan menjadi solusi yang sangat apik. Tetapi templat literal tidak didukung di IE11 dan variabel "let" akan keluar dari ruang lingkup ketika berada di dalam blok fungsi, jadi implementasi ini penuh dengan bahaya.
Neville
7

Satu hal yang perlu diingat adalah bahwa Javascript berjalan pada klien, dan bukan pada server. Anda tidak dapat "memuat file" dari server dalam Javascript. Apa yang terjadi adalah Javascript mengirimkan permintaan ke server, dan server mengirim kembali konten file yang diminta. Bagaimana Javascript menerima konten? Itulah gunanya fungsi callback. Dalam kasus Edward, itu

    client.onreadystatechange = function() {

dan dalam kasus danb, itu

 function(data) {

Fungsi ini dipanggil setiap kali data tiba. Versi jQuery secara implisit menggunakan Ajax, itu hanya membuat pengkodean lebih mudah dengan merangkum kode itu di perpustakaan.

atmelino
sumber
7

Pembaruan 2020: Menggunakan Ambil dengan async / tunggu

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

Perhatikan bahwa awaithanya dapat digunakan dalam suatu asyncfungsi. Contoh yang lebih panjang mungkin

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');

gman
sumber
5

Ini seharusnya bekerja di hampir semua browser:

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

Selain itu, ada FetchAPI baru :

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

Saat bekerja dengan jQuery, alih-alih menggunakan jQuery.get, mis

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

Anda bisa menggunakan .loadyang memberi Anda bentuk yang jauh lebih kental:

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

.loadmemberi Anda juga opsi untuk memuat sebagian halaman yang dapat berguna, lihat api.jquery.com/load/ .

yvesonline
sumber
-3

Jika input Anda terstruktur sebagai XML, Anda dapat menggunakan importXMLfungsi ini. (Info lebih lanjut di sini di quirksmode ).

Jika bukan XML, dan tidak ada fungsi yang setara untuk mengimpor teks biasa, maka Anda bisa membukanya dalam iframe tersembunyi dan kemudian membaca konten dari sana.

nickf
sumber