Bir metin dosyasının içeriğini bir javascript değişkenine nasıl yüklerim?


155

Benim web uygulaması http: //localhost/foo.txt kökünde bir metin dosyası var ve ben javascript bir değişkeni içine yüklemek istiyorum .. harika ben bunu yapardı:

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

Javascript'te nasıl benzer bir sonuç alabilirim?

Yanıtlar:


142

XML olmadan XMLHttpRequest, yani AJAX.

Bunu tam olarak nasıl yaptığınız, kullandığınız JavaScript çerçevesine bağlıdır, ancak birlikte çalışabilirlik sorunlarını göz ardı edersek, kodunuz aşağıdaki gibi görünecektir:

var istemci = yeni XMLHttpRequest ();
client.open ('GET', '/foo.txt');
client.onreadystatechange = function () {
  uyarısı (client.responseText);
}
) (Client.send;

Normalde, XMLHttpRequest tüm platformlarda mevcut değildir, bu nedenle bazı fudgery yapılır. Bir kez daha, en iyi bahis jQuery gibi bir AJAX çerçevesi kullanmaktır.

Ek bir husus: bu yalnızca foo.txt aynı etki alanında olduğu sürece çalışır. Farklı bir etki alanındaysa, aynı kökenli güvenlik ilkeleri sonucu okumanızı engeller.


1
Aynı köken ilkesi için geçici bir çözüm, jQuery tarafından da desteklenen JSONP kullanmaktır (istemci tarafı kısmı için)
OneWorld

3
onreadystatechange içinde, onreadystatechange olayının yüklenmesi, yüklenmesi, yükseltilmesi için yükseltildiğinden, durumun ne olduğunu bilmek için XMLHttpRequest Nesnesinin readystate özelliğine (örneğin: client.readystate) erişebileceğinizi eklemek yararlı olabilir. .. bu yüzden client.responseText'i kullanabilmek için onreadystatechange içinde client.readystate == 4 beklemeniz gerekir.
GameAlchemist

2
@GameAlchemist: Harika cevabın üzerine tökezledi. Sadece çoğu tarayıcıda readyState deve kasalı olduğunu not etmek istedim, bu yüzden kod böyle bir şey olmalı:if (client.readyState === 4){ }
snorpey

6
Ek client.onloadendolarak tamamlanmış verileri yapabilir ve alabilirsiniz
Athena

2
Yanıt, client.readyStateözellik değerinin denetlenmesini içerecek şekilde yeniden düzenlenmelidir . Ben öyle oluncaya kadar aşağıya indiriyorum, insanlar cevabın sadece kısmen doğru olduğunu keşfetmek için yorumları okumazlar.
amn

84

İşte nasıl jquery yaptı:

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

o düz sekmeli metin verileri (çalışmak görünmüyor docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
balon balıkları

7
Kullandığınız yerel olarak test ediyorsanız bu çalışmayı değil yaptığı Bildirimi file://ie: file:///example.com/foo.html. Firefox sözdizimi hatası ve Chrome bloklarını şikayet ediyor, çünkü bunu bir Çapraz Kaynak isteği olarak görüyor.
Akronix

@pufferfish dataTypeParametreyi belirtirseniz düz verilerle çalışacaktır , bkz. api.jquery.com/jQuery.get/
yvesonline

1
@Akronix, http://...parçayı dışarıda bırakırsanız , aynı alanda yaşadığından, örneğin çalışır jQuery.get("foo.txt", ...).
yvesonline

@Akronix Yerel olarak test etmenin kolay bir yolu var mı? Kökenler arası istek hataları almaya devam ediyorum
ahuff44

50

Güncelleme 2019: Getirme özelliğini kullanarak:

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
Evet Getirme (yeni) bir standarttır, tescilli bir uzantı değildir.
Laurent Caillette

1
2019 ve getirme güzel bir şey. Bu, Samsung İnternet de dahil olmak üzere tüm modern tarayıcılar için yeni bir yol…
Dave Everitt

Kompakt ve çalışan bir kod, Vic, teşekkürler. Hata işlemeyi başarmak response.okiçin, kodunuza bir yer (veya eşdeğeri) koymak mümkün müdür ? Ben çok deneyimli değilim fetch, bu yüzden ayarlamak için tam yerini bilmiyorum.
Sopalajo de Arrierez

Harika bir çözüm. Bu, tam bir başlangıç ​​için bile süper kolaydı. Son adımda console.log yerine değişken olarak saklanır, artık her yerde kullanabilirsiniz.
AveryFreeman

27

Metin dosyasından yalnızca sabit bir dize istiyorsanız, bunu JavaScript olarak ekleyebilirsiniz:

// 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>

Dosyadan yüklenen dize, yüklendikten sonra JavaScript tarafından erişilebilir hale gelir. `(Backtick) karakteri , metin bloğunuzda hem" hem de "karakterlerine izin vererek bir şablon hazır bilgisi başlar ve biter .

Chrome yerel file://düzende URL'lerde AJAX'a izin vermeyeceğinden, bu yaklaşım yerel olarak bir dosya yüklemeye çalıştığınızda iyi çalışır .


1
Bu gerçekten kaygan bir çözüm olurdu. Ancak şablon değişmezi IE11'de desteklenmez ve "let" değişkeni bir işlev bloğunun içindeyken kapsam dışı olur, bu nedenle bu uygulama tehlike ile doludur - sakının.
Neville

7

Akılda tutulması gereken bir şey, Javascript'in sunucuda değil istemcide çalıştığıdır. Javascript'teki sunucudan gerçekten "dosya yükleyemezsiniz". Olan şey, Javascript'in sunucuya bir istek göndermesi ve sunucunun istenen dosyanın içeriğini geri göndermesidir. Javascript içeriği nasıl alıyor? Geri arama işlevi bunun içindir. Edward'ın durumunda, bu

    client.onreadystatechange = function() {

ve danb'ın durumunda,

 function(data) {

Bu işlev, veri her ulaştığında çağrılır. JQuery sürümü dolaylı olarak Ajax kullanır, bu kodu kütüphanede kapsülleyerek kodlamayı kolaylaştırır.


7

Güncelleme 2020: Getirmeyi async / await ile kullanma

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

awaitYalnızca bir asyncişlevde kullanılabileceğini unutmayın . Daha uzun bir örnek

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

Bunun neredeyse tüm tarayıcılarda çalışması gerekir:

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

Ayrıca, yeni FetchAPI var:

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

1

JQuery ile çalışırken jQuery.get, örneğin

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

.loadçok daha yoğun bir form veren kullanabilirsiniz :

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

.loadsize kullanışlı olabilecek kısmi sayfalar yükleme seçeneği de sunar, bkz. api.jquery.com/load/ .


-3

Girişiniz XML olarak yapılandırılmışsa, bu importXMLişlevi kullanabilirsiniz . (Daha fazla bilgi burada quirksmode ).

XML değilse ve düz metni içe aktarmak için eşdeğer bir işlev yoksa, metni gizli bir iframe'de açabilir ve ardından içeriği oradan okuyabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.