Як завантажити вміст текстового файлу в змінну javascript?


155

У мене є текстовий файл у корені мого веб-додатку http: //localhost/foo.txt, і я хотів би завантажити його в змінну в javascript .. in groovy я би це зробив:

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

Як я можу отримати подібний результат у javascript?

Відповіді:


142

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

Точний спосіб, яким ви це зробите, залежить від того, який фреймворк JavaScript ви використовуєте, але якщо ми нехтуємо питаннями сумісності, ваш код буде виглядати приблизно так:

var client = новий XMLHttpRequest ();
client.open ('GET', '/foo.txt');
client.onreadystatechange = функція () {
  оповіщення (client.responseText);
}
client.send ();

Однак, як правило, XMLHttpRequest доступний не на всіх платформах. Знову ж таки, найкраще скористатися рамкою AJAX на зразок jQuery.

Ще одне додаткове враження: це працюватиме лише до тих пір, поки foo.txt знаходиться в одному домені. Якщо він знаходиться в іншому домені, політика безпеки одного і того ж джерела не дозволить вам прочитати результат.


1
Для вирішення політики з тим самим походженням використовується JSONP, який також підтримується jQuery (для частини клієнта)
OneWorld

3
може бути корисним додати, що всередині onreadystatechange ви можете отримати доступ до властивості readystate об’єкта XMLHttpRequest (на прикладі: client.readystate), щоб знати, що таке статус, оскільки подія onreadystatechange піднімається для завантаження, завантажується, .. .. тож вам доведеться зачекати клієнта.readystate == 4 всередині вжезмінної зміни, перш ніж ви зможете використовувати client.responseText.
GameAlchemist

2
@GameAlchemist: натрапив на вашу чудову відповідь. Я просто хотів зазначити, що в більшості браузерів readyState є верблюд, тому код повинен бути приблизно таким:if (client.readyState === 4){ }
snorpey

6
Крім того, ви можете зробити client.onloadendі просто отримати заповнені дані
Афіна

2
Відповідь слід відредагувати, щоб включити перевірку client.readyStateвартості властивості. Я зволікаю до тих пір, поки це не станеться, люди не збираються читати коментарі, щоб виявити відповідь лише частково правильно.
amn

84

ось як я це зробив у jquery:

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

що, здається, не працює з текстовими даними простого табличного ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
pufferfish

7
Зверніть увагу , що це не працює , якщо ви перевіряєте його на місці з допомогою , а file://саме: file:///example.com/foo.html. Firefox скаржиться на синтаксичну помилку та Chrome блокує, оскільки вважає це запитом Cross-Origin.
Akronix

@pufferfish він буде працювати з простими даними, якщо вказати dataTypeпараметр, див. api.jquery.com/jQuery.get/
yvesonline

1
@Akronix, якщо ви не залишите http://...частину, оскільки вона працює на одному домені, вона працюватиме, наприклад,jQuery.get("foo.txt", ...) .
yvesonline

@Akronix Чи існує простий спосіб перевірити це на місцевому рівні? Я продовжую отримувати помилки у запиті Cross-origin
ahuff44

50

Оновлення 2019: Використання витягу:

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
Так Вибір - це (останній) стандарт, а не власне розширення.
Лоран Кайлетт

1
Настав 2019 рік, а видобуток - справа краси. Це шлях для всіх сучасних браузерів, включаючи Інтернет в Інтернеті Samsung, який щойно наздогнав…
Дейв Еверітт

Компактний та робочий код, Вік, дякую тобі. Щоб досягти помилок, чи можна було б десь response.ok(або еквівалент) помістити десь у свій код? Я не дуже досвідчений fetch, тому не знаю, де саме його встановити.
Sopalajo de Arrierez

Прекрасне рішення. Це було дуже просто навіть для початківця. Зберігається в змінній замість 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, і змінна "нехай" буде поза сферою, коли всередині функціонального блоку, тому ця реалізація загрожує небезпекою - будьте обережні.
Невілл

7

Слід пам’ятати, що Javascript працює на клієнті, а не на сервері. Ви дійсно не можете "завантажити файл" із сервера в Javascript. Що відбувається, це те, що Javascript відправляє запит на сервер, а сервер повертає вміст запитуваного файлу. Як Javascript отримує вміст? Ось для чого і функція зворотного дзвінка. У випадку Едварда, тобто

    client.onreadystatechange = function() {

і у випадку данб, це так

 function(data) {

Ця функція викликається кожного разу, коли дані надходять. Версія jQuery неявно використовує Ajax, вона просто полегшує кодування шляхом інкапсуляції цього коду в бібліотеці.


7

Оновлення 2020: Використання функції " Виконання" за допомогою асинхронізації / очікування

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, і немає еквівалентної функції для імпорту простого тексту, то ви можете відкрити його в прихованому кадрі і потім прочитати вміст звідти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.