2016-04-02 25 views
6

Zaskoczyło mnie już doświadczenie związane ze względnymi ścieżkami w Javascript. Mam sprowadzić sytuację do następującego:Względne ścieżki z pobieraniem w JavaScript

Załóżmy, że masz strukturę katalogów jak:

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

Wszystkie moje app.html nie jest prowadzony js/app.js

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

app.js ładuje plik JSON i wstawiono go na początku body:

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

Dane są ważne JSON, tylko ciąg:

"Hello World" 

Jest to dość minimalne wykorzystanie fetch, ale jestem zaskoczony, że adres URL, które mijam na fetch musi być w stosunku do app.html zamiast w stosunku do app.js. Spodziewam się, to droga do pracy, ponieważ data.json i app.js są w tym samym katalogu (js/):

fetch('data.json') // nope 

Czy istnieje wyjaśnienie, dlaczego tak jest?

+2

JS może pochodzić z miejsc, których folderów nie można wskazać ze względu na SOP, więc zawsze był zależny od strony. – dandavis

+1

Pamiętaj, że to nie ma wiele wspólnego z JavaScriptem; to sposób, w jaki przeglądarki internetowe interpretują ścieżki w żądaniach HTTP. Strona główna definiuje kontekst URL dla wszystkiego: odniesienia do skryptów, obrazy, arkusze stylów i XHR. – Pointy

+0

Cześć, ponieważ ścieżki wartości CSS nie działają w ten sposób, są względne w stosunku do katalogu źródłowego arkusza stylów - jeśli masz, powiedzmy, body {background-image: url (pic.gif)} w css/styles.css, wtedy przeglądarka będzie szukała pic.gif w css /, nie /. Takie zachowanie można oczekiwać po JS, ale najwyraźniej nie jest to prawda. – pat

Odpowiedz

7

Kiedy mówisz fetch('data.json'), efektywnie żądasz http://yourdomain.com/data.json, ponieważ jest względna do strony, z której żądasz. Powinieneś prowadzić z przednim ukośnikiem, który wskaże, że ścieżka jest względna względem katalogu głównego domeny: fetch('/js/data.json'). Lub w pełni jakość w domenie fetch('http://yourdomain.com/js/data.json').