Pourquoi Javascript traite-t-il les URL relatives différemment du HTML standard? Pensez à l'URL suivante (ou parcourez-la simplement): http://en.wikipedia.org/wiki/Rome . Ouvrez une console Firebug (ou une autre console Javascript) et entrez les informations suivantes :
var x = new XMLHttpRequest();
x.open("GET", "foo", true);
x.send("bar");
Sous mon système, la demande est envoyée à " http://en.wikipedia.org/wiki/foo ". Le "Rome" dans l'URL est simplement ignoré. La même demande avec une barre oblique de fin dans l'URL (" http://en.wikipedia.org/wiki/Rome/ ") ajoute le "foo" à l'URL complète.
Cela semble rendre assez difficile l'encodage des URL correctes en Javascript. Existe-t-il des bibliothèques Javascript qui permettent de résoudre ce problème?
(J'ai déjà posé une question similaire question } _, mais plus spécifique à jQuery, où cela se produit également. J'espère obtenir une meilleure réponse avec cette question un peu plus indépendante de la bibliothèque.)
(mis à jour pour le rendre plus lisible)
C'est ainsi que les chemins relatifs sont supposés fonctionner.
Imaginez que l'adresse actuelle est la suivante:
Absolute:protocol://some.domain.name/dir1/dir2/filename
Si vous ne spécifiez qu'un nouveau nom de fichier "foo", vous obtenez le même protocole, l'hôte et les répertoires, seul le nom du fichier est modifié:
Relatif:foo
Absolute:protocol://some.domain.name/dir1/dir2/foo
Si vous spécifiez un chemin complet "/ dir3/filename2", vous obtenez le même protocole et le même nom d'hôte, mais avec un autre chemin:
Relative:/dir3/filename2
Absolute:protocol://some.domain.name/dir3/filename2
Vous pouvez également spécifier le nom d'hôte "//another.domain.name/dir5/filename3" et obtenir le même protocole mais un autre hôte, dir et nom de fichier:
Relative://another.domain.name/dir5/filename3
Absolute:protocol://another.domain.name/dir5/filename3
Ce qui pourrait être déroutant, c’est qu’un serveur Web en interne peut ajouter un/à la fin de l’URL si l’URL spécifiée pointe vers un répertoire et non vers un fichier.
protocol://some.domain.name/somename
Si "quelque chose" est un répertoire vers lequel le serveur Web peut le traduire (possible avec une redirection)
protocol://some.domain.name/somename/
METTRE À JOUR
As cameron a déclaré dans un commentaire: Pour référence, voir l'étape 6 de la section 4 de RFC 1808
On dirait que http://code.google.com/p/js-uri/ est la bibliothèque de choix pour la manipulation des URL en général et pour ce type de calcul absolu-relatif en particulier:
new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString()