テキストファイルの内容をJavaScript変数にロードするにはどうすればよいですか?


155

Webアプリhttp://localhost/foo.txtのルートにテキストファイルがあり、それをjavascriptの変数にロードしたいのですが、groovyでは次のようにします。

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

JavaScriptで同様の結果を得るにはどうすればよいですか?

回答:


142

XMLなしのXMLHttpRequest、つまりAJAX。

これを行う正確な方法は、使用しているJavaScriptフレームワークによって異なりますが、相互運用性の問題を無視すると、コードは次のようになります。

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

ただし、通常、XMLHttpRequestはすべてのプラットフォームで使用できるわけではないため、多少の手間がかかります。ここでも、jQueryのようなAJAXフレームワークを使用するのが最善の策です。

もう1つの考慮事項:これは、foo.txtが同じドメイン上にある場合にのみ機能します。別のドメインにある場合、同じ生成元のセキュリティポリシーにより、結果を読み取ることができません。


1
同一生成元ポリシーの回避策は、jQuery(クライアント側部分)でもサポートされているJSONPを使用することです
OneWorld

3
onreadystatechange内で、XMLReadRequestオブジェクト(この例ではclient.readystate)のreadystateプロパティにアクセスして、ステータスが何であるかを知ることができることを追加すると便利です。 ..したがって、client.responseTextを使用するには、onreadystatechange内でclient.readystate == 4を待つ必要があります。
GameAlchemist 2012年

2
@GameAlchemist:あなたの素晴らしい答えに出会いました。私はほとんどのブラウザでのreadyStateがラクダ同棲であることに注意することは望んでいたので、コードは次のようなものでなければなりません:if (client.readyState === 4){ }
snorpey

6
さらにclient.onloadend、完了して完全なデータを取得できます
Athena

2
client.readyStateプロパティ値のチェックを含むように、回答を編集する必要があります。私はそれがそうであるまでそれを反対票を投じています、人々は答えが部分的にしか正しくないことを発見するためにコメントを読むつもりはありません。
アム2015

84

ここに私がjqueryでそれをした方法があります:

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

プレーンな表形式のテキストデータ(で動作するようには思えないdocs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests
フグ

7
file://ie を使用してローカルでテストしている場合、これは機能しないことに注意してくださいfile:///example.com/foo.html。Firefoxは構文エラーについて文句を言い、Chromeはそれをクロスオリジンリクエストと見なすためブロックされます。
Akronix

@pufferfish dataTypeパラメータを指定すると、プレーンデータで機能します。api.jquery.com
jQuery.get /を

1
@Akronixは、http://...一部を省略した場合、同じドメインに存在するため、機能しますjQuery.get("foo.txt", ...)
yvesonline 2015

@Akronixローカルでテストする簡単な方法はありますか?クロスオリジンリクエストエラーが
何度も

50

2019年更新: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
はいFetchは(最近の)標準であり、独自の拡張機能ではありません。
Laurent Caillette

1
それは2019年であり、フェッチは美しいものです。これは、Samsung Internetを含め、最近のすべてのブラウザーにとって
追い風

コンパクトで機能するコード、Vic、ありがとう。エラー処理を実現するためresponse.okに、コードのどこかに(または同等のもの)を配置することは可能ですか?での経験fetchがあまりないので、正確な設定場所がわかりません。
ソパラホデアリエーレス

素晴らしいソリューション。これは完全な初心者にとっても非常に簡単でした。最後のステップでconsole.logの代わりに変数に格納され、どこでも使用できるようになりました。
AveryFreeman

27

テキストファイルの定数文字列のみが必要な場合は、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>

ファイルから読み込まれた文字列は、読み込まれた後にJavaScriptからアクセス可能になります。`(backtick)文字は、テンプレートリテラルの開始と終了を表し、テキストブロックで"と "の両方の文字を使用できます。

Chromeはfile://スキームを使用したURLでAJAXを許可しないため、ファイルをローカルにロードしようとする場合、このアプローチはうまく機能します。


1
これは本当に洗練されたソリューションになるでしょう。しかし、テンプレートリテラルはIE11ではサポートされておらず、「let」変数は関数ブロック内ではスコープ外になるため、この実装は危険に満ちています-注意してください。
ネヴィル

7

Javascriptはサーバー上ではなくクライアント上で実行されることを覚えておいてください。JavaScriptでサーバーから実際に「ファイルをロード」することはできません。何が起こるかは、Javascriptがサーバーにリクエストを送信し、サーバーがリクエストされたファイルのコンテンツを返信することです。JavaScriptはどのようにコンテンツを受け取りますか?これがコールバック関数の目的です。エドワードの場合、それは

    client.onreadystatechange = function() {

danbの場合、それは

 function(data) {

この関数は、データがたまたま到着したときに呼び出されます。jQueryバージョンは暗黙的にAjaxを使用し、そのコードをライブラリーにカプセル化することでコーディングを容易にします。


7

Update 2020:Fetchを非同期/ 待機で使用する

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

関数awaitでのみ使用できることに注意してくださいasync。より長い例は

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

これはほとんどすべてのブラウザで機能するはずです。

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

さらに、新しいFetchAPI があります。

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

1

jQueryを使用する場合jQuery.get、を使用する代わりに、例えば

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はあなたにもっと凝縮された形を与えるものを使うことができます:

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

.load便利になる可能性がある部分的なページをロードするオプションも提供します。api.jquery.com/ load /を参照してください。


-3

入力がXMLとして構造化されている場合は、importXML関数を使用できます。(詳細はこちらのquirksmodeで)。

XMLでなく、プレーンテキストをインポートするための同等の機能がない場合は、非表示のiframeで開き、そこからコンテンツを読み取ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.