Convertir chemin d'accès relatif à l'absolu, à l'aide de JavaScript
Il existe une fonction qui me donne l'url comme:
./some.css
./extra/some.css
../../lib/slider/slider.css
C'est toujours un chemin d'accès relatif.
Voyons-nous savoir le chemin actuel de la page, comme http://site.com/stats/2012/
, pas sûr de savoir comment puis-je convertir ces chemins relatifs pour les vrais?
On doit obtenir quelque chose comme:
./some.css => http://site.com/stats/2012/some.css
./extra/some.css => http://site.com/stats/2012/extra/some.css
../../lib/slider/slider.css => http://site.com/lib/slider/slider.css
Pas de jQuery, seulement à la vanille javascript.
- C'est pour javascript de l'application, pas d'un site web classique.
Vous devez vous connecter pour publier un commentaire.
Cela devrait le faire:
~
,~/media/style.css
, a couru dans l'autre jourbase
. Et ce n'est pas exactement un chemin relatif 🙂 Si vous avez besoin d'aide avec les chemins contenant un tilde, veuillez poser une nouvelle question/
par exemple/some.css
. Une mise en œuvre correcte serait dans ce cas supprimer tous les éléments dans la pile après le nom de domaine./
n'est pas relative. Ma fonction ne considère que les chemins d'accès, pas d'Uri.Javascript va le faire pour vous. Il n'y a pas besoin de créer une fonction.
Mais si vous en avez besoin en fonction:
Mise à jour: version plus Simple si vous avez besoin de la pleine chemin d'accès absolu:
link.href
après un retourné l'résolu URL (c'est à dire, pas besoin de les recréer manuellement le href).Le plus simple, efficace et de façon correcte de le faire, de sorte qu'il suffit d'utiliser URL api.
Performance sage, cette solution est sur le pair avec l'aide de la manipulation de chaîne et deux fois plus rapide que la création de
a
tag.Ce de MDN est incassable!
Exemple d'utilisation:
/
. Exemple:relPathToAbs("/?foo=bar")
devrait revenir "/?foo=bar" au lieu de cela, il retourne/questions/14780350/?foo=bar
ce qui signifie qu'il n'est pas correctement la détection de l'un des principaux/
lors de l'envoie le chemin jusqu'à la racine.http(s)://
) et le recherche / hash segments (?
/#
). Il n'est pas préoccupation de cette fonction pour séparer le chemin partie de la recherche / hash les pièces, aussi parce que les Expressions Régulières peuvent faire, c'est très facile:relPathToAbs("./?foo=bar#someHash".replace(/^[^\?#]*/, "$&"))
/
est déjà un absolu chemin! Par conséquent, il n'a pas de sens de le mettre comme argument de cette fonction! La chaîne"/?foo=bar"
est déjà absolu chemin d'accès.relPathToAbs("/?foo=bar")
. Il ne renvoie pas/?foo=bar
(parce que c'est déjà l'absolu), il retourne/questions/14780350/?foo=bar
./?foo=bar
est un mal chemin d'accès relatif (d'ailleurs c'est un chemin absolu). Valide chemin relatif doit commencer avec/^(?:\.\.?\/)*[^\/]/
. E. g.:/^(?:\.\.?\/)*[^\/]/.test("./hello/world")
-->true
;/^(?:\.\.?\/)*[^\/]/.test("../hi")
-->true
;/^(?:\.\.?\/)*[^\/]/.test("../././../foo")
-->true
;/^(?:\.\.?\/)*[^\/]/.test("/")
-->false
;/^(?:\.\.?\/)*[^\/]/.test("/?foo=bar")
-->false
;https:/path
. Yep, c'est la bonne URL à la même machine mais avec un protocole sécurisé. Vous pouvez indifinitely parler de "qu'est-ce que true relative URL" mais quand vous faites un travail que vous devez travailler les choses, pas seulement un résumé des essais./foo?bar
est relative à l'hôte actuel.//host/foo?bar
est par rapport à l'actuel protocole.https://path
pour moi.Si vous voulez faire un par rapport à l'absolu de conversion pour obtenir un lien à partir d'une page web personnalisée dans votre navigateur (pas pour la page qui exécute votre script), vous pouvez utiliser une version améliorée de la fonction suggéré par @Bergi:
Il va revenir
null
si quelque chose est faux.Utilisation:
Cela fonctionne sur IE6 trop, contrairement à d'autres solutions (voir Obtenir une URL absolue à partir d'un relatif. (IE6 question))
Href solution ne fonctionne qu'une fois que le document est chargé (au moins dans IE11). Cela a fonctionné pour moi:
Proposé et accepté solution ne prend pas en charge le serveur d'Url relatives et ne fonctionne pas sur les Url absolues.
Si un membre de ma famille est /sites/folder1 il ne fonctionne pas par exemple.
Ici est une autre fonction qui prend en charge complète, serveur parent ou les Url relatives ainsi que ../pour remonter d'un niveau. Il n'est pas parfait, mais couvre un grand nombre d'options.
À utiliser lorsque votre URL de base n'est pas l'URL de la page, sinon il existe de meilleures alternatives.
Espère que cette aide. C'était vraiment frustrant de ne pas avoir cette des services publics de base disponibles en JavaScript.
//www.example.com/page
.J'ai dû ajouter un correctif à la solution retenue, car nous pouvons avoir des barres obliques après # dans notre angularjs navigation.
if (charAt(0) !== ".") return relative;
pour gérer le cas oùrelative
est déjà un chemin d'accès absolu, donc je n'ai pas vérifier si c'est relatif tout d'abord, avant d'appeler cette fonction.J'ai trouvé une solution très simple pour ce faire tout en continuant à soutenir IE 10 (IE ne prend pas en charge l'URL de l'API) à l'aide de la L'histoire de l'API (IE 10 ou plus). Cette solution fonctionne sans aucune manipulation de chaîne.
history.replaceState()
ne déclenchent pas de navigation navigateur, mais encore modifierdocument.location
et prend en charge relative ainsi que des chemins absolus.Le seul inconvénient de cette solution est que si vous utilisez déjà l'Histoire de l'API et qui ont mis une coutume de l'état avec un titre, l'état actuel du titre est perdu.
Cela fonctionne. mais uniquement lorsque vous ouvrez une page avec ce nom de fichier. il ne fonctionne pas bien lorsque vous ouvrez un lien comme ceci
stackoverflow.com/page
. il travaillera avecstackoverflow.com/page/index.php