Làm cách nào để tải nội dung của tệp văn bản vào biến javascript?


155

Tôi có một tệp văn bản trong thư mục gốc của ứng dụng web http: //localhost/foo.txt và tôi muốn tải nó vào một biến trong javascript .. trong Groovy tôi sẽ làm điều này:

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

Làm cách nào tôi có thể nhận được kết quả tương tự trong javascript?

Câu trả lời:


142

XMLHttpRequest, tức là AJAX, không có XML.

Cách chính xác mà bạn làm điều này phụ thuộc vào khung JavaScript bạn đang sử dụng, nhưng nếu chúng tôi bỏ qua các vấn đề về khả năng tương tác, mã của bạn sẽ trông giống như:

var client = new XMLHttpRequest ();
client.open ('NHẬN', '/foo.txt');
client.onreadystatechange = function () {
  cảnh báo (client.responseText);
}
client.send ();

Mặc dù vậy, thông thường, XMLHttpRequest không có sẵn trên tất cả các nền tảng, do đó, một số fudgery đã được thực hiện. Một lần nữa, cách tốt nhất của bạn là sử dụng khung AJAX như jQuery.

Một xem xét thêm: điều này sẽ chỉ hoạt động miễn là foo.txt trên cùng một tên miền. Nếu đó là trên một tên miền khác, chính sách bảo mật cùng nguồn gốc sẽ ngăn bạn đọc kết quả.


1
Một cách giải quyết cho chính sách cùng nguồn gốc là sử dụng JSONP cũng được jQuery hỗ trợ (cho phần phía máy khách)
OneWorld

3
Có thể hữu ích khi thêm rằng, bên trong onreadystatechange, bạn có thể truy cập thuộc tính readystate của Đối tượng XMLHttpRequest (trong ví dụ: client.readystate) để biết trạng thái là gì, vì sự kiện onreadystatechange được đưa ra để tải, tải, .. .. vì vậy bạn phải đợi client.readystate == 4 bên trong onreadystatechange trước khi bạn có thể sử dụng client.responseText.
GameAlchemist

2
@GameAlchemist: vấp phải câu trả lời tuyệt vời của bạn. Tôi chỉ muốn lưu ý rằng trong hầu hết các trình duyệt readyState đều có vỏ lạc đà, vì vậy mã phải giống như thế này:if (client.readyState === 4){ }
snorpey

6
Ngoài ra, bạn có thể làm client.onloadendvà chỉ cần lấy dữ liệu đã hoàn thành
Athena

2
Câu trả lời nên được điều chỉnh lại để bao gồm kiểm tra client.readyStategiá trị tài sản. Tôi đang hạ thấp nó cho đến khi nó, mọi người sẽ không đọc các bình luận để khám phá câu trả lời chỉ đúng một phần.
Amn

84

đây là cách tôi đã làm nó trong jquery:

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

điều đó dường như không hoạt động với dữ liệu văn bản dạng bảng đơn giản ( docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests )
cá nóc

7
Lưu ý rằng điều này không hoạt động nếu bạn đang thử nghiệm cục bộ bằng cách sử dụng file://: file:///example.com/foo.html. Firefox phàn nàn về lỗi cú pháp và các khối Chrome vì nó coi đó là yêu cầu Cross-Origin.
Akronix

@pufferfish nó sẽ hoạt động với dữ liệu đơn giản nếu bạn chỉ định dataTypetham số, xem api.jquery.com/jQuery.get/
yvesonline

1
@Akronix nếu bạn rời khỏi http://...phần đó, vì nó nằm trên cùng một tên miền, nó sẽ hoạt động, vd jQuery.get("foo.txt", ...).
yvesonline

@Akronix Có cách nào dễ dàng để kiểm tra cục bộ không? Tôi liên tục nhận được lỗi yêu cầu nguồn gốc chéo
ahuff44

50

Cập nhật 2019: Sử dụng Tìm nạp:

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
Có Fetch là một tiêu chuẩn (gần đây), không phải là một phần mở rộng độc quyền.
Laurent Caillette

1
Đó là năm 2019, và lấy là một điều tuyệt vời. Đây là cách cho tất cả các trình duyệt hiện đại, bao gồm cả Samsung Internet, vừa bắt kịp nhóm
Dave Everitt

Một mã nhỏ gọn và làm việc, Vic, cảm ơn bạn. Để đạt được xử lý lỗi, có thể đặt một số response.ok(hoặc tương đương) ở đâu đó trong mã của bạn không? Tôi không có nhiều kinh nghiệm fetch, vì vậy tôi không biết chính xác nơi để đặt nó.
Sopalajo de Arrierez

Giải pháp tuyệt vời. Điều này là siêu dễ dàng ngay cả đối với một người mới bắt đầu hoàn thành. Được lưu trữ trong biến thay vì console.log ở bước cuối cùng, bây giờ có thể sử dụng ở bất cứ đâu.
AveryFreeman

27

Nếu bạn chỉ muốn một chuỗi không đổi từ tệp văn bản, bạn có thể bao gồm chuỗi đó dưới dạng 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>

Chuỗi được tải từ tệp trở nên có thể truy cập được JavaScript sau khi được tải. Ký tự `(backtick) bắt đầu và kết thúc một mẫu bằng chữ , cho phép cả hai ký tự" và 'trong khối văn bản của bạn.

Cách tiếp cận này hoạt động tốt khi bạn đang cố tải một tệp cục bộ, vì Chrome sẽ không cho phép AJAX trên các URL với file://sơ đồ.


1
Đây sẽ là một giải pháp thực sự khéo léo. Nhưng nghĩa đen mẫu không được hỗ trợ trong IE11 và biến "let" sẽ nằm ngoài phạm vi khi bên trong khối chức năng, do đó việc triển khai này gặp nhiều rủi ro - hãy cẩn thận.
Neville

7

Một điều cần lưu ý là Javascript chạy trên máy khách chứ không phải trên máy chủ. Bạn thực sự không thể "tải một tập tin" từ máy chủ trong Javascript. Điều gì xảy ra là Javascript gửi yêu cầu đến máy chủ và máy chủ sẽ gửi lại nội dung của tệp được yêu cầu. Javascript nhận nội dung như thế nào? Đó là chức năng gọi lại dành cho. Trong trường hợp của Edward, đó là

    client.onreadystatechange = function() {

và trong trường hợp của danb, nó là

 function(data) {

Chức năng này được gọi bất cứ khi nào dữ liệu xảy ra. Phiên bản jQuery hoàn toàn sử dụng Ajax, nó chỉ giúp mã hóa dễ dàng hơn bằng cách gói mã đó trong thư viện.


7

Cập nhật 2020: Sử dụng Fetch với async / await

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

Lưu ý rằng awaitchỉ có thể được sử dụng trong một asyncchức năng. Một ví dụ dài hơn có thể là

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

Điều này sẽ hoạt động trong hầu hết các trình duyệt:

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

Ngoài ra, có FetchAPI mới :

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

1

Khi làm việc với jQuery, thay vì sử dụng jQuery.get, vd

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

bạn có thể sử dụng .loadmà cung cấp cho bạn một hình thức cô đọng hơn nhiều:

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

.loadcũng cung cấp cho bạn tùy chọn để tải một phần trang có thể có ích, xem api.jquery.com/load/ .


-3

Nếu đầu vào của bạn được cấu trúc dưới dạng XML, bạn có thể sử dụng importXMLhàm. (Thông tin thêm ở đây tại quirksmode ).

Nếu đó không phải là XML và không có chức năng tương đương để nhập văn bản thuần túy, thì bạn có thể mở nó trong iframe ẩn và sau đó đọc nội dung từ đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.