2010-08-16 12 views
16

Je souhaite définir l'attribut href de base d'une page en JavaScript en fonction du nom d'hôte actuel. J'ai généré des pages HTML qui peuvent être visualisées sur différents noms d'hôte, ce qui signifie que la génération d'une balise href de base fonctionnera dans un nom d'hôte mais sera incorrecte dans l'autre.Comment définir la base href d'une page en Javascript?

+0

J'ai généralement un fichier JS de constantes que j'inclus dans lequel je place '$ .serverRoot' pour être la racine relative de l'hôte (par exemple' $ .serverRoot = '/ myapp /'; ' –

+0

Cela fonctionne pour des choses comme AJAX demandes, mais si je devais ajuster tous les chemins d'image et lier hrefs pour tenir compte d'une variable Javascript je devrais faire une énorme quantité de travail.L'utilisation de la balise de base href résout beaucoup de problèmes que j'avais avec le fait d'avoir le même fichier HTML accessible sur différents noms d'hôte, mais il a introduit le problème des chemins incorrects sur un nom d'hôte –

Répondre

30

La bonne façon de le faire est de faire un document.write de l'étiquette basé sur l'hôte actuel:

Correct:

<script type="text/javascript"> 
document.write("<base href='http://" + document.location.host + "' />"); 
</script> 

Cette méthode a produit des résultats corrects dans IE, FF, Chrome et Safari. Elle produit un (bon) résultat différent que Dowing les éléments suivants:

incorrect:

<script type="text/javascript"> 
var newBase = document.createElement("base"); 
newBase.setAttribute("href", document.location.hostname); 
document.getElementsByTagName("head")[0].appendChild(newBase); 
</script> 
+0

J'ai rencontré des problèmes avec le robot d'indexation de Google en utilisant cette méthode, je n'ai pas mis d'espace entre 'et />', et le robot d'exploration interprète ma base href comme document.location.hostname '/>. Cela peut poser un problème avec cette solution.Pour plus d'informations, voir: http://www.google.com/support/forum/p/Webmasters/ thread? tid = 2cff8eadfdf3a393 & hl = fr & fid = 2cff8eadfdf3a393000498a325f9c75d –

+3

Il n'y a aucune raison pour laquelle 'document.write' serait" correct "et l'insertion correcte d'un noeud dans l'arbre du document serait" incorrecte ". La question tombe dans la catégorie «résoudre le mauvais problème», mais l'approche décrite comme «correcte» ici insère souvent une balise «de base» à un mauvais endroit, pour commencer. Si le code est dans la partie 'head', il est plutôt inutile (pourquoi ne pas y mettre la balise' base' droite comme HTML normal?), Et s'il est exécuté ailleurs, il insérera habituellement 'base' dans' body'. –

+1

Je suis curieux de savoir pourquoi la méthode "incorrecte" est incorrecte. –

2
document.write ("");

<script> 
 
document.write("<base href='"+ window.location.protocol +'//' + window.location.host + "' >"); 
 
</script>

0

Je pense que vous feriez mieux de le faire de cette façon

<script type="text/javascript"> 
     document.head.innerHTML = document.head.innerHTML + "<base href='" + document.location.href + "' />"; 
    </script> 

Comme location.hostname ne retourne pas le contexte de l'application racine! Vous pouvez également enregistrer le document.location sur la console console.log pour voir toutes les métadonnées disponibles sur document.location.

Questions connexes