2016-04-02 30 views
6

Sono stato sorpreso da un'esperienza con i relativi percorsi in Javascript oggi. Ho bollito giù la situazione al seguente:Percorsi relativi con recupero in Javascript

Supponiamo di avere una struttura di directory simile:

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

Tutta la mia app.html fa è gestito js/app.js

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

app.js carica il file JSON e lo attacca all'inizio di body:

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

I dati sono validi JSON, solo una stringa:

"Hello World" 

Questo è un uso piuttosto minimale di fetch, ma sono sorpreso che l'URL che mi passa per fetch deve essere relativo alla app.html invece che rispetto al app.js. Mi aspetterei questo percorso al lavoro, dal momento che data.json e app.js sono nella stessa directory (js/):

fetch('data.json') // nope 

C'è una spiegazione del perché questo è il caso?

+2

JS può provenire da posizioni le cui cartelle non possono essere puntate a causa di SOP, quindi è sempre stato relativo alla pagina. – dandavis

+1

Si noti che questo non ha molto a che fare con JavaScript; è il modo in cui i browser Web interpretano i percorsi nelle richieste HTTP. La pagina principale definisce il contesto URL per tutto: riferimenti di script, immagini, fogli di stile e XHR. – Pointy

+0

Ciao, per quello che vale i percorsi CSS non funzionano in questo modo, sono relativi alla directory sorgente del foglio di stile - se hai, per esempio body {background-image: url (pic.gif)} in css/styles.css, quindi il browser cercherà pic.gif in css /, non /. Questo è il comportamento che mi aspetterei con JS, ma a quanto pare non è vero. – pat

risposta

7

Quando si dice fetch('data.json') si richiede effettivamente http://yourdomain.com/data.json poiché è relativo alla pagina da cui si sta facendo la richiesta. Dovresti guidare con una barra in avanti, che indicherà che il percorso è relativo alla radice del dominio: fetch('/js/data.json'). O completamente di qualità con il tuo dominio fetch('http://yourdomain.com/js/data.json').