Как загрузить содержимое текстового файла в переменную javascript?

155

У меня есть текстовый файл в корне моего веб-приложения http: //localhost/foo.txt, и я хотел бы загрузить его в переменную в javascript .. В Groovy я хотел бы сделать это:

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

Как я могу получить аналогичный результат в JavaScript?

danb
источник

Ответы:

142

XMLHttpRequest, т.е. AJAX, без XML.

Точный способ, которым вы это делаете, зависит от того, какую платформу JavaScript вы используете, но если мы не примем во внимание проблемы взаимодействия, ваш код будет выглядеть примерно так:

var client = new XMLHttpRequest ();
client.open ('GET', '/foo.txt');
client.onreadystatechange = function () {
  оповещения (client.responseText);
}
client.send ();

Тем не менее, как правило, XMLHttpRequest доступен не на всех платформах, поэтому некоторая путаница уже сделана. Еще раз, вам лучше всего использовать AJAX-фреймворк, такой как jQuery.

Еще одно соображение: это будет работать только до тех пор, пока foo.txt находится в одном домене. Если он находится в другом домене, политики безопасности того же источника не позволят вам прочитать результат.

Эдвард З. Ян
источник
1
Обходной путь для политики того же происхождения использует JSONP, который также поддерживается jQuery (для клиентской части)
OneWorld,
3
было бы полезно добавить, что внутри onreadystatechange вы можете получить доступ к свойству readystate объекта XMLHttpRequest (в примере: client.readystate), чтобы узнать, каков статус, так как событие onreadystatechange вызывается для загрузки, загрузки, .. .. так что вы должны подождать client.readystate == 4 внутри onreadystatechange, прежде чем вы сможете использовать client.responseText.
GameAlchemist
2
@GameAlchemist: наткнулся на ваш отличный ответ. Я просто хотел отметить, что в большинстве браузеров readyState имеет верблюжий корпус, поэтому код должен выглядеть примерно так:if (client.readyState === 4){ }
snorpey
6
Кроме того, вы можете сделать client.onloadendи просто получить заполненные данные
Афина
2
Ответ должен быть отредактирован, чтобы включить проверку client.readyStateзначения свойства. Я опускаю голос до тех пор, пока это не произойдет, люди не собираются читать комментарии, чтобы обнаружить, что ответ только отчасти прав.
атп
84

вот как я это сделал в jquery:

jQuery.get('http://localhost/foo.txt', function(data) {
    alert(data);
});
danb
источник
это не похоже на работу с простой табличный текст данных ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
Pufferfish
7
Обратите внимание , что это не работает , если вы проверяете его на месте с помощью , а file://именно: file:///example.com/foo.html. Firefox жалуется на синтаксическую ошибку и блоки Chrome, потому что он рассматривает его как перекрестный запрос.
Акроникс,
@pufferfish он будет работать с простыми данными, если вы укажете dataTypeпараметр, см. api.jquery.com/jQuery.get/
yvesonline
1
@Akronix, если вы пропустите http://...часть, потому что она живет в том же домене, она будет работать, например jQuery.get("foo.txt", ...).
yvesonline
@ Akronix Есть ли простой способ проверить это локально? Я продолжаю получать ошибки запроса кросс-происхождения
ahuff44
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

Vic
источник
4
Да Fetch - это (недавний) стандарт, а не проприетарное расширение.
Лоран
1
Это 2019 год, а выборка - это красота. Это путь для всех современных браузеров, включая Интернет Samsung, который только что догнал ...
Дейв Эверитт
Компактный и рабочий код, Вик, спасибо тебе. Для того, чтобы добиться обработки ошибок, можно ли было бы поместить некоторые 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 не разрешит AJAX для URL-адресов со file://схемой.

Эрик Уггельдаль
источник
1
Это было бы действительно изящное решение. Но шаблонный литерал не поддерживается в IE11, и переменная «let» будет находиться вне области видимости, когда находится внутри функционального блока, поэтому эта реализация чревата опасностью.
Невилл
7

Следует иметь в виду, что Javascript запускается на клиенте, а не на сервере. Вы не можете «загрузить файл» с сервера в Javascript. В результате Javascript отправляет запрос на сервер, а сервер отправляет обратно содержимое запрошенного файла. Как Javascript получает содержимое? Вот для чего предназначена функция обратного вызова. В случае с Эдвардом это

    client.onreadystatechange = function() {

и в случае Данба, это

 function(data) {

Эта функция вызывается всякий раз, когда поступают данные. Версия jQuery неявно использует Ajax, она просто упрощает кодирование, инкапсулируя этот код в библиотеке.

atmelino
источник
7

Обновление 2020: использование Fetch с async / await

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

GMan
источник
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) )
12Me21
источник
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/ .

yvesonline
источник
-3

Если ваш ввод был структурирован как XML, вы можете использовать importXMLфункцию. (Более подробная информация здесь в Quirksmode ).

Если это не XML, и нет эквивалентной функции для импорта простого текста, тогда вы можете открыть его в скрытом фрейме и затем прочитать содержимое оттуда.

nickf
источник