Javascript : chemin relatif vers une image

Fermé
jcmartin01 - 13 juin 2010 à 12:26
 jcmartin01 - 13 juin 2010 à 15:47
Bonjour,
Je cherche à accéder à une image en utilisant un chemin relatif.

En css c'est extremement simple. Peu importe d'où le fichier css est inclus
(que ce soit depuis www/index.php ou www/dossier/index.php par exemple)
le ./ dans le fichier css correspond au répertoire dans lequel se trouve le fichier css
Donc si on a 2 dossiers : www/css et www/images
dans css/fichier.css on peut faire un .tag {background:url(../images/fond.jpg)}

Bon.

J'ai l'impression que ce chemin relatif n'est pas géré de la meme maniere dans les fichiers javascript.
Je fais un alert(document.location.pathname) dans mon .js et selon l'endroit d'où le fichier javascript est inclus, je n'ai pas le meme résultat.
(il ne me dira pas systématiquement www/js meme si concrétement le js se trouve dans ce répertoire)
Du coup, si je veux lui donner le chemin relatif vers une image (dans www/images) je suis coincé...


Si vous avez une solution : Comment accéder de manière relative au répertoire d'images depuis un js ?



1) je peux résoudre mon pb en marquant /www/images/fond.jpg (le / devant www correspondant à la racine du site)
le pb est que mon docmentRoot change selon l'environnement (l'arborescence à indiquer devant fond.jpg change donc)

2) pareil je ne veux pas faire de
<base href="http://www.fdhksf.com/www/" />
ou
<base href="http://www.fdhksf.com/appli1/www/" />
selon les cas
car ca perturberait mes autres accès relatifs et m'obligerait à avoir des versions différentes selon les environnements


Merki pour vos idées !

2 réponses

La 1°) est la meilleur des solutions

tu peut aussi faire
<script type="text/javascript">
   var path = <?php echo realpath(__FILE__); ?>;
</script>


Puis tu utilise ta variable path
1
Bon, en fait

selon l'environnement sur lequel je travaille, le documentRoot (dans httpd.conf) change

En dév, il vaut C:/ProgramFiles/easyphp/www, ce qui fait que l'on accède aux applis par les urls suivantes :
http://127.0.0.1/appli1/index.php ou
http://127.0.0.1/appli2/index.php
Ce qui est pratique en dév pour travailler sur diverses applis..

En prod, pour l'appli1 hébergée sur un serveur indépendant, le documentRoot vaut C:/ProgramFiles/easyphp/www/appli1, ce qui fait que l'on accède à l'appli1 par l'url suivante :
http://127.0.0.1/index.php

Par conséquent, je ne peux pas, dans un fichier .js, marquer img.src = "/appli1/images/fond.jpg"
car le chemin pourrait etre img.src = "/images/fond.jpg" si je suis en prod...


Pour résoudre ce pb, je n'utilise plus le '/' au début de mes chemins d'accès aux images, j'essaye (!!) de passer par des urls commencant par './'



Ce qui est pratique en css, c'est que si l'on a cette arborescence :
www/images/fond.jpg
www/css/fichier.css

on peut écrire, dans le fichier.css qq chose comme
.tag {background:url('../images/fond.jpg')}

car "./" est considéré comme le répertoire du fichier css en cours de lecture
On se fiche alors de savoir si l'adresse de base du site est http://127.0.0.1 ou http://127.0.0.1/appli1 vu que l'on travaille avec des chemins relatifs au fichier css et non à partir de l'adresse de base du site..





Ce n'est apparement pas ce comportement que l'on retrouve en javascript




Pour preuve, essayez de faire ceci :

dans un .js marquez
img = new Image();
img.src = './fond.jpg';

mettez le .js, le fond.jpg et votre fichier index.php de test dans un meme répertoire, tout fonctionne. Normal.

Mettez maintenant le index.php dans un sous répertoire, faites l'include correct de votre .js (avec ../ devant donc)
L'image n'est plus trouvée (car elle est recherchée dans le sous répertoire, et non pas dans le répertoire dans lequel se trouve le .js)

Encore mieux, voici comment faire planter l'exemple 1 qui marchait bien :
ajoutez des parametre à votre url :
ainsi, si
http://127.0.0.1/index.php fonctionne
http://127.0.0.1/index.php?un/deux/trois ne marchera plus !
en effet, le .js est alors persuadé que son 'working directory' est un répertoire hypothétique nommé C:/ProgramFiles/easyphp/www/un/deux/trois
dans lequel il ne trouvera pas l'image fond.jpg




Comment s'en sortir ?
Merci pour vos idées


(en fait j'ai solutionné mon truc : je ne charge plus une image mais un div avec une classe particuliere. Dans le .css qui définit cette classe, je mets le chemin d'accès à l'image que je veux afficher en background du div, chemin qui commence par "./"
Cette solution ne me convient toutefois pas car je voudrais précharger mon image, et je ne peux faire cela qu'en javascript ! J'aimerais donc une réponse différente de celle ci)
1