2016-04-02 21 views
6

Tôi đã rất ngạc nhiên bởi trải nghiệm có đường dẫn tương đối trong Javascript ngày hôm nay. Tôi đã luộc xuống tình hình như sau:Đường dẫn tương đối có tìm nạp trong Javascript

Giả sử bạn có một cấu trúc thư mục như:

app/ 
    | 
    +--app.html 
    +--js/ 
     | 
     +--app.js 
     +--data.json 

Tất cả tôi app.html không được chạy js/app.js

<!DOCTYPE html> 
<title>app.html</title> 
<body> 
<script src=js/app.js></script> 
</body> 

app.js tải file JSON và dính vào đầu số body:

// js/app.js 
fetch('js/data.json') // <-- this path surprises me 
    .then(response => response.json()) 
    .then(data => app.data = data) 

Các dữ liệu có giá trị JSON, chỉ là một chuỗi:

"Hello World" 

Đây là một cách sử dụng khá tối thiểu của fetch, nhưng tôi ngạc nhiên rằng URL mà tôi vượt qua để fetch phải được liên quan đến app.html thay vì liên quan đến app.js. Tôi mong chờ con đường này để làm việc, kể từ data.jsonapp.js là trong cùng một thư mục (js/):

fetch('data.json') // nope 

Có một lời giải thích cho lý do tại sao đây là trường hợp?

+2

JS có thể đến từ các địa điểm có thư mục không thể được trỏ đến do SOP, vì vậy nó luôn là trang tương đối. – dandavis

+1

Lưu ý rằng điều này không thực sự liên quan nhiều đến JavaScript; đó là cách mà các trình duyệt web diễn giải đường dẫn trong các yêu cầu HTTP. Trang chính xác định ngữ cảnh URL cho mọi thứ: tham chiếu tập lệnh, hình ảnh, biểu định kiểu và XHR. – Pointy

+0

Xin chào, vì đường dẫn CSS đáng giá không hoạt động theo cách này, chúng liên quan đến thư mục nguồn của biểu định kiểu - nếu bạn có, ví dụ: body {background-image: url (pic.gif)} trong css/styles.css, sau đó trình duyệt sẽ tìm pic.gif trong css /, not /. Đó là hành vi tôi mong đợi với JS, nhưng dường như điều đó không đúng. – pat

Trả lời

7

Khi bạn nói fetch('data.json'), bạn đang yêu cầu hiệu quả http://yourdomain.com/data.json vì nó liên quan đến trang bạn đang thực hiện yêu cầu. Bạn nên dẫn đầu bằng dấu gạch chéo, cho biết đường dẫn có liên quan đến gốc của miền: fetch('/js/data.json'). Hoặc chất lượng hoàn toàn với miền của bạn fetch('http://yourdomain.com/js/data.json').

Các vấn đề liên quan